• 为什么说private方法是有罪的


           具体的这句话从什么地方获得,我已经无从考证了,但是想想我们现在使用private的场景,你慢慢的就会发现,private的方法,大多数都是copy代码,当然我只是说大多数,还有就是大多数private方法实际上是设计的不太合理的遗留物。我先说两个我应用的场景,第一种场景与设计没有关系,只是与维护系统有关系。

           第一种场景:维护系统,扩展系统

           不知道大家有没有这种场景,需要维护或者扩展一个系统,这个时候,你只能通过继承某个类来做事情,不能通过修改source来达到目的,而这个时候,你会发现,你真正需要修改的,或者言之,替换的只是一个小小的方法,你只要override这个小方法就可以,而这个时候,很不幸的是,他是一个private方法,你能怎么办呢?只能找到更大范围的方法来进行override,然后把其它不相关的方法在copy到自己的类里面,只有这样才能达到目的。

           第二种场景,设计角度,这个是我真正想说的地方。

           大家写代码的时候,很多时候,会遵循Refactor里面的一些原则,会把很多代码抽成很多小的方法,而这些小的方法往往会是private的方法,这些private方法,大体上可以分为两类,一类是Util方法,一类是业务方法。

           先说第一种Util方法,很多时候,大多数是判断时间是否合理,String是否为空,字符是否够长等等,诸如此类的方法,就是与业务一点关系都没有的,这种方法,我想不用我说什么了,你自己应该明白,为什么这些是可耻的了吧,或者有罪了吧。因为这些Util方法很多地方都会用到的,不止这一个地方,这些方法如果是private的话,你会在这个项目里面很多地方都看到类似的private方法,大家都是copy来,copy去,DRY原则不用重复了。

            再说第二种业务方法的,这类我也分为两种,A是业务逻辑在错误地方,B是模板方法中的流程方法。

             A业务逻辑在错误地方

             举个小例子:

              有个业务逻辑判断是否可以卖烟给这个人,一个判断逻辑就是是否18岁

              

    private boolean isCanSale(Person person) {
      if
    (person.getAge() < 18) {   return false;   }
      return true;
    }

           但是慢慢的你会发现,很多地方都需要这个业务逻辑,比如是否可以卖酒给这个人,同样也是如此。那么这个时候,其实就是这个方法逻辑,放错了地方,应该属于Person的属性。

       

    public boolean isAdult() {
      if (this.getAge() < 18) {
          return false;
      }
      return true;
    }

      在别的地方就会调用person.isAdult(),就可以了。当然在深入的讲,是否为成年人,这个其实还是与地方的法律有关系的,所以后面可能还会把这个方法挪到另外的地方去。

         B 模板方法中的流程方法

         就是在模板类中,有很多流程的方法,这些方法写成了private,例如我之前的例子

       

    public abstract class FatherTemplate  {
      public void doProcess() {
        a();
        b();
        c();
      }
        
      private void a() {
         // doSomething();
       };
     
       private void void b(); 
    
       private void void c();
     }

     这种方法,在将来就会遇到我说的第一种情况,就是对于扩展和使用会出现很多问题,同时这个地方变成框架中的一部分的时候,也会遇到第一种情况,对于扩展不是很友好。当然如果说,我的方法,永远不会扩展,那么你也会发现,这里面的方法,也会逐步的挪到其它的类里面。----没有继承使用,那么就会变成其它类里面的公开方法,这个是我的判断。

       private的第一原则,就是永远不要private

  • 相关阅读:
    RTB
    urllib.error.HTTPError: HTTP Error 403: Forbidden
    HTTP请求过程详解
    python中用filter求素数
    python把str转换为int
    如何判断一个GPS点是否在以另一个GPS点为圆心100米为半径的圆内(Java代码)
    word2010表格中的内容怎么设置行距
    java创建二叉树并实现非递归中序遍历二叉树
    java创建二叉树并递归遍历二叉树
    极客DIY:打造属于自己的无线移动渗透测试箱
  • 原文地址:https://www.cnblogs.com/kaka/p/3347522.html
Copyright © 2020-2023  润新知