美文网首页优美编程
通过剔除上下文依赖减弱封装的耦合性

通过剔除上下文依赖减弱封装的耦合性

作者: 小遁哥 | 来源:发表于2020-06-06 12:15 被阅读0次

0

高内聚以内部功能的完备性衡量封装的度,低耦合以与外部的关联程度衡量封装的度。

看一个可以说是高内聚其实是高耦合的列子。

import { ValidateStatus } from 'antd/lib/form/FormItem';

export interface HeroState {
  name: string;
  status: ValidateStatus;
  help: string;
}

...
<Form.Item help={help} validateStatus={status}>
  <Input
    value={name}
    onChange={e => this.onNameChange(e.target.value)}
    placeholder={'新增英雄名称'}
  />
</Form.Item>
...
<Button type="primary" onClick={this.onAdd}>
  新增英雄
</Button>
image.png

onAdd

  private onAdd = () => {
    const maxLength = 4;
    const { name } = this.state;
    let isPass = false,
      help = '',
      status: ValidateStatus = '';

    if (name.length > maxLength) {
      help = `长度不能大于${maxLength}`;
      status = 'error';
    } else if (name.trim().length === 0) {
      help = `请输入名字`;
      status = 'error';
    } else {
      isPass = true;
    }
    if (isPass) {
      //发起请求
    }

    this.setState({
      help: help,
      status: status,
    });
  };

效果:



1

onAdd,狗蛋验证了英雄名字的合法性,这块逻辑完全可以独立出来,狗蛋本没有这么高的觉悟,奈何他发现还有修改的功能,也要验证名字...

于是乎

  private onAdd = () => {
    const { name } = this.state;
    const isPass = this.validateName(name);
    if (isPass) {
      //发起请求
    }
  };
  private validateName = (name: string): boolean => {
    const maxLength = 4;
    let isPass = false,
      help = '',
      status: ValidateStatus = '';

    if (name.length > maxLength) {
      help = `长度不能大于${maxLength}`;
      status = 'error';
    } else if (name.trim().length === 0) {
      help = `请输入名字`;
      status = 'error';
    } else {
      isPass = true;
    }
    this.setState({
      help: help,
      status: status,
    });
    return isPass;
  };

2

狗蛋愉快的下班回家了,然而第二天他绝望的发现,修改的时候还是无法复用,就是因为这段代码

    this.setState({
      help: help,
      status: status,
    });

修改和添加的的文本框不能共用helpstatus

最终修改如下:

interface IValidateInfo {
  isPass:boolean;
  status: ValidateStatus;
  help: string;
}
 private onAdd = () => {
    const { name } = this.state;
    const {isPass,status,help} = this.validateName(name);
    if (isPass) {
      //发起请求
    }
    this.setState({
      status,
      help
    })
  };
 
  private validateName = (name: string): IValidateInfo => {
    const maxLength = 4;

    let validateInfo: IValidateInfo = {
      isPass: true,
      help: '',
      status: '',
    };
    if (name.length > maxLength) {
      validateInfo = {
        ...validateInfo,
        help: `长度不能大于${maxLength}`,
        status: 'error',
      };
    } else if (name.trim().length === 0) {
      validateInfo = {
        ...validateInfo,
        help: `请输入名字`,
        status: 'error',
      };
    }

    return validateInfo;
  };

3

既然validateName 已经不依赖this了,它完全可以升级为静态方法或是移动到其他文件,一来可以据此划分代码,二来可以提升复用性。

上下文等同于闭包,依赖等同于访问外层作用域,最外层的闭包是window

绝不是有上下文依赖就都要剔除,若是变成了低内聚同样会给使用带来麻烦。

当产生纠结时,宁可低内聚也不要高耦合,把一把沙子放进一袋大米里容易,想要拿出来就难了。

因为高耦合有短视的利好性,可能在相当长的时间内也不会产生问题,毕竟业务有多样性,所以大多数情况下会写出高耦合的代码,尽管在理论层次上不够优雅,但对于实际来看不造成真实伤害

对于高内聚、低耦合的追求,无论是前期设计还是后期完善都没必要过度的投入时间,是否过度取决于你有多长时间,你的团队有多长时间

要优先整理非业务代码的逻辑,对于业务代码则从严重程度高的开始,比如不能满足当下需求、经常发生问题、迭代功能需要投入大量时间等。

随着代码和业务之间依赖的增加,高内聚、低耦合就和日益变化的需求息息相关,现在是2020年,如果一部手机里可以取出一把筷子,自然是高耦合,如果不能安装App,自然是低内聚,但以后可就说不准了。

诸天气浩荡,我道日兴隆

轻松一刻

相关文章

  • 通过剔除上下文依赖减弱封装的耦合性

    0 高内聚以内部功能的完备性衡量封装的度,低耦合以与外部的关联程度衡量封装的度。 看一个可以说是高内聚其实是高耦合...

  • 开发思想/习惯/原则

    封装(外界怎么使用方便,就怎么封装 低耦合:减少控制器之间互相依赖性、关联性高内聚:在一个类中,抽取方法 加载数据...

  • Java进阶面试题列表

    解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(...

  • Dagger 2 完全解析(一),Dagger 2 的基本使用

    依赖注入 什么是依赖 依赖注入是一种面向对象的编程模式,它的出现是为了降低耦合性,所谓耦合就是类之间依赖关系,所谓...

  • Android依赖剔除和冲突解决

    剔除依赖app/模块下build.gradle 1、通过包名+模块名剔除configurations.all {a...

  • “高内聚,低耦合”

    什么是耦合(大量的重复代码,可读性不高): 软件工程中对象之间的耦合度就是对象之间的依赖性。耦合性是程序结构中各个...

  • 耦合性学习

    耦合性(Coupling) 模块之间的依赖关系,控制关系、调用关系、数据传递关系 非直接耦合 Nondirect ...

  • Dagger简单使用及实现原理

    什么是依赖注入 依赖注入是一种面向对象的编程模式,它的出现是为了降低耦合性,所谓耦合就是类之间的依赖关系,所谓降低...

  • 如何解耦?

    高内聚,低耦合。控制代码复杂度! 封装与抽象隐藏实现的复杂性隔离实现的易变性给依赖的模块提供稳定且易用的抽象接口 ...

  • spring实战笔记1、spring之旅

    spring如何简化java开发? 基于pojo的轻量级和最小侵入性编程;通过依赖注入和面向接口实现松耦合;基于切...

网友评论

    本文标题:通过剔除上下文依赖减弱封装的耦合性

    本文链接:https://www.haomeiwen.com/subject/atstzhtx.html