zoukankan      html  css  js  c++  java
  • 【设计原则和建议】 方法


    方法
      1.一个方法内的代码不能超过30行.
    • 绝大部分方法都可以在30行内结束.
    • 这是一种强迫开发者优化设计和代码的方式.
       
      2.什么样的方法不应该抛出异常?
    • 静态构造函数,抛出以后整个类型就再也无法使用了.
    • 构析函数.
    • 属性的get方法 (有些类的设计会违背这个特性).
    • Dispose (理论上也不应该抛出异常,不过有些设计已经抛出了异常).
       
      3.还没有实现的方法应该抛出NotImplementedException 异常.
     
      
      4.移除没有被调用到的方法 .
     
      5.方法命名推荐Pascal命名.
    • 推荐动词+名词方式  例如 GetUser, DisableUser
    • 如果在类的实例方法上,推荐动词做方法名  例如User.Create



    静态方法和实例方法
     
      1.静态方法应该是线程安全的
    •   调用方使用静态方法(如Console.Write),调用方会预期静态方法是线程安全的
            public static Dictionary<string, object> dict = new Dictionary<string, object>();
    public static ConcurrentDictionary<string, object> concurrentDict = new ConcurrentDictionary<string, object>();
    public static void Test1()
    {
    if (!dict.ContainsKey("key"))//线程不安全
    {
    dict["key"] = "value";
    }
    }
    public static void Test2()
    {
    concurrentDict["key"] = "value";//线程安全,
    }
      
      
      2.如果一个方法没有使用到this,那么考虑声明为静态方法
     
      3.基本类库和常用方法优先设计为静态方法 (如Log.Error  SqlHelper.Execute)
     
      4.为什么选择静态方法
    • 容易实现面向过程的编程
    • 静态方法调用较为简单,少了一个new的过程
    • 如果希望设计一个较为独立的方法(和类中的其他对象关系较少),静态方法是一个较好的选择 ,静态方法往往更容易移植
    • 性能较好
        1.不需要在运行时判断多态 (没有继承链的问题)
        2.调用静态方法不需要传递实例对象指针
        3.实例方法需要至少new一个对象, 有GC的压力 
     
      5.为什么选择实例方法
    • 和面向对象的设计结合较好
    • 借助多态等,功能比静态方法要强大



    方法可访问性
     
      1.在声明方法的时候显式声明可访问性, 不要使用默认值,以免不熟悉默认访问性的开发者搞错了
     
      
      2.保持最低的可访问性, 例如能private的就不要public
    • 避免第三方错误调用了不应该public的方法
    • 避免第三方引用了public方法以后,在重构时无法移除该方法
       
      3. 使用new关键字复写父类方法 , 一般要保持同级或者较高的可访问性
     public class ClassA
    {
    public virtual void Test()
    {
    }
    }
    public class ClassC : ClassA
    {
    protected new void Test() //bad
    {
    }
    }


    方法继承
     

      1.如果想重写父类的方法,一定要用new关键字显式覆盖,以免非预期的重写

        public class ClassA
    {
    public void Test()
    {
    }
    }

    public class ClassB : ClassA
    {
    public new void Test()//good
    {
    }
    }

    public class ClassC : ClassA
    {
    public void Test() //bad
    {
    }
    }



      2.某些方法需要一起被override, 例如  IComparable.CompareTo  和 Equals , 又例如重写运算符的时候  =  和 !=


      3.只在希望子类override方法实现的时候使用virtual关键字


      4.不要在构造函数中调用虚方法

    •    调用虚方法时,直到运行时之前都不会选择执行该方法的实际类型。 构造函数调用虚方法时,可能尚未执行调用该方法的实例的构造函数。
      5.如果是实现了Dispose方法,那么在该方法体内,请调用父类的Dispose方法


    对比

      1.和属性对比    

    • 属性返回值相对静态,所以DateTime.Now是一个不好的设计(因为Now的值会一直变化)
    • 方法返回值相对动态,所以Guid.NewGuid()是一个好的设计


    部分内容引用自MSDN,FxCop 和其他第三方文章..

    因为本人水平有限,如有遗漏或谬误,还请各位高手指正

  • 相关阅读:
    不同操作系统的宏定义区分
    WINDOWS下VS编译opencv并加载自定义模块
    基于模板匹配的马赛克检验
    [转]C++模板详解
    [Linux命令]Unix/Linux信号量的使用
    [C/C++基础]读写文件
    [Linux命令]查看Linux系统相关命令
    【Linux命令】查找命令
    【QT相关】文件、目录基础操作
    【MFC相关】图片显示
  • 原文地址:https://www.cnblogs.com/PurpleTide/p/2206881.html
Copyright © 2011-2022 走看看