微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

因为够懒,所以我严守单一职责

因为够懒,所以我严守单一职责

其实想把6大原则放一起说的,但是写开了以后才发现,光一个原则就能扯出一大通东西来,还是分开说吧。

===========

哪里单一?

单一嘛,大家都懂的,只干一个事。

但是,哪里需要单一呢?只有类和接口? 任何东西都要单一! 容我给你从小了慢慢往大了扯~

  • 变量要单一.

    啊这个没疑问的吧,一个变量只干一件事,比如一个按钮不能又是播放按钮又是关机键。关机和开机放一起没关系,因为他们都是控制电源的。这里要提一点,既负责播放又负责关机这个设计只能说不好,但并不能说是错的。架构设计没有对与错之分!!!

  • 方法要单一.

    方法单一是单一这个原则最容易实现的一块。方法的单一体现在,一个方法干且只干下面类型中的一种事情:初始化的、View显示的、对象获取的、布尔判断的、逻辑分发的等等等。这是非常有利于代码阅读与代码修改的,后面我们详细讲。

  • 接口要单一.

    接口的不单一设计体现在:某个实现类不得不以空方法的方式实现一个接口里的方法。接口的一个功能是做隔离和解耦,接口的方法都是public,一个无用的public方法暴露给依赖类,对依赖类来说很容易产生误解的一件事,“你给我的,就是我都能用的,不要口头告诉我不要调用你这个方法。”

  • 类单一

    这个地方就打问号了。为什么呢?因为类的单一太难界定了。连老外的大神都说了:“This is sometimes hard to see”。这个有时很难说。举例子吧:

    我设计了一个在ListView为空的时候对用户提示的控件,我想把它设计成自给自足的,所以在这个控件里面做了逻辑判断,是不是为空呀,为什么为空呀。根据不同的判断结果,进行不同的样式展示。老大看了以后说不行了:“你这个东西设计的不单一啊!一个控件应该只负责显示,怎么能做业务逻辑处理呢?”我说:“这是一个单一的功能模块,不只是一个View。它是一个功能单一的东西,不是指责单一的。”

    我俩谁对谁错?这个是争论不出来结果的。所以,还是看情况!

  • 包要单一.

    包单一有助于项目的开发,没有人愿意维护一个结构乱七八糟的项目。

如何做到单一?

说完了哪里单一,我们讲讲如何做到单一。单一说着很简单,但其实对于新手来说,并不是那么容易,因为实际业务太多样了,一定要讨论这个事情,不亚于哲学家开辩论会!!

  • 大胆写,随便写。写完才能改嘛。

    我有一个习惯,代码写完 3 ~ 5 次自Review。说来惭愧,只是担心被现在的同事和未来的同事嫌弃。因为知道自己会Review这么多次,所以不会考虑太多。(真心的,考虑太多就不用写了,计划赶不上变化)。等到写完了,Review之后你会发现很多问题,开始改,这一改,你就知道了,这样写才是更好的,下次就记住了。

    而且优化代码是一件成就感爆棚的事情哦~

  • 怎么改?捷径:消除重复。

    当你的一段代码重复出现超过两次以后,你就要开始考虑是不是设计上有问题了,因为出现了超过两次,你很难保证,将来不会出现更多次。

    代码有追求的猿,是拒绝重复的!

    • 方法级单一实现:将所有重复的代码段按上一节【方法要单一】中讲的类型分门别类的放到不同方法里。这是一件简单粗暴的事情,做完它,你就发现你的代码焕然一新。

    • 接口接的单一实现:同样对于初级程序猿来说,接口的设计也是满路荆棘。讲几个经验吧。

      • 当你的某个实现类实现这个接口以后发现有空的无用接口方法,改!拆接口!
      • 在外部类依赖你的实现类时,有无关public方法暴露,用接口进行隔离吧。
      • 可以关注下官方API的接口都在做什么,照着来吧,一般都没错的。
    • 类的单一:这个还是像上面的说的:This is sometimes hard to see。但还是有几个雷区是一定要避免的。

      • 珍爱生命,远离业务。抽离所有的业务逻辑,单独管理,这些由产品经理决定的东西~珂珂!
      • 继承是侵入式的,很可能让你类不知不觉多了一些不应该多的东西。
      • 对于View控件来说,ListView是一个比较好借鉴的榜样。ListView本身只负责Item的显示和回收利用,Adapter负责逻辑,决定Item长什么样。

单一后的样子

最后我们讲讲单一以后的样子,看看你能不能交上一份好的成绩单。(话说这个成绩单应该能保证你及格吧?)

  • 没有超过两次以上的重复代码段。(你看有多懒,不愿意重复写)

  • 在你有需求变动的时候,只改一个地方就好了。(你看有多懒,不愿意多改几个地方)

  • 暴露给依赖类的方法,都是可以用的。(你看有多懒,都不想动脑子)

  • 方法代码行不超过一屏。(你看有多懒,都不想上下滚动下屏幕)

(不要较真,某些情况真的是避免不了的。原则,有时也是用来打破的)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图:提供一种方法顺序访问一个聚合对象中的每个元素,而又不想暴露该对象的内部表示。应用:STL标准库迭代器实现、Java集合类型迭代器等模式结构:心得:迭代器模式的目的是在不获知集合对象内部细节的同时能对集合元素进行遍历操作
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:(1)同步阻塞IO(BlockingIO):即传统的IO模型。(2)同步非阻塞IO(Non-blockingIO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的N
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定义一系列算法,把他们封装起来,并且使他们可以相互替换,使算法可以独立于使用它的客户而变化。应用:排序的比较方法、封装针对类的不同的算法、消除条件判断、寄存器分配算法等。模式结构:心得:对对象(Context)的处理操作可
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个作用于某对象结构中的各元素的操作,它使你在不改变各元素的类的前提下定义作用于这些元素的新操作。应用:作用于编译器语法树的语义分析算法。模式结构:心得:访问者模式是要解决对对象添加新的操作和功能时候,如何尽可能不修改对象的类的一种方
命令模式(Command)命令模式(Command)[Action/Transaction]意图:将一个请求封装为一个对象,从而可用不同的请求对客户参数化。对请求排队或记录请求日志,以及支持可撤消的操作。应用:用户操作日志、撤销恢复操作。模式结构:心得:命令对象的抽象接口(Command)提供的两个
生成器模式(Builder)生成器模式(Builder)意图:将一个对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。 应用:编译器词法分析器指导生成抽象语法树、构造迷宫等。模式结构:心得:和工厂模式不同的是,Builder模式需要详细的指导产品的生产。指导者(Director)使用C
设计模式学习心得《设计模式:可复用面向对象软件的基础》一书以更贴近读者思维的角度描述了GOF的23个设计模式。按照书中介绍的每个设计模式的内容,结合网上搜集的资料,我将对设计模式的学习心得总结出来。网络上关于设计模式的资料和文章汗牛充栋,有些文章对设计模式介绍生动形象。但是我相信“一千个读者,一千个
工厂方法模式(Factory Method)工厂方法模式(Factory Method)[Virtual Constructor]意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实力化延迟到子类。应用:多文档应用管理不同类型的文档。模式结构:心得:面对同一继承体系(Produc
单例模式(Singleton)单例模式(Singleton)意图:保证一个类只有一个实例,并提供一个访问它的全局访问点。应用:Session或者控件的唯一示例等。模式结构:心得:单例模式应该是设计模式中最简单的结构了,它的目的很简单,就是保证自身的实例只有一份。实现这种目的的方式有很多,在Java中
装饰者模式(Decorator)装饰者模式(Decorator)[Wrapper]意图:动态的给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。应用:给GUI组件添加功能等。模式结构:心得:装饰器(Decorator)和被装饰的对象(ConcreteComponent)拥有统一的接口