none
如何得知一个函数该传入哪些参数才算正确 RRS feed

  • 问题

  • 写一个C#函数,但是不知道该给它传哪些参数,一般是根据什么来断定的呢,请高人指点技巧
    2010年4月6日 9:22

答案

  • 这个问题属于设计范畴,干建是看您如何定义您的方法。一般说来,方法体中的执行代码不超过 25 行。参数不超过 4 个。参数类型按照方法的名称和意义来定义。

    比如 1,验证用户的方法,这样定义就好:

    public bool AuthenticateUser(string userName, string password)

    2,创建用户的方法,因为用户数据可能很多,这样参数就有可能多于 4 个,达到十几个 (比如姓名,性别,年龄,出生日期,身份证号码等,但有时候又不是所有信息必填),这时,需要采用 Entity 模式,即将这些数据构成一个实体类型,然后将此实体类型作为参数。

    public bool CreateUser(User user)

    3、尽量不要在非 Interop 下使用可选参数,比如

    public int Add(int a, int b, int c = 0)

    是没有必要的,尽量考虑重载。如

    public int Add(int a, int b)
    public int Add(int a, int b, int c)

    4、参数类型要清晰,该用 int 时用 int,该枚举就枚举,该 Uri 就 Uri,比如

    public Stream DownloadFileFromUrl(Uri location, string fileName, string contentType, int contentLength)

    5、在某些场合请考虑可空类型,比如,一个从 QueryString 传递过来的值。

    [HttpGet]
    public ActionResult Index(int? pageIndex)

    6、弄清楚 Guid 和 int,比如,数据库 Entity 类型上的主键,尽量用 Guid。

    public Product GetProduct(Guid productId)

    7、参数的排序也很重要,最直接并最能想到的放前面。比如,吃饭,先要告诉计算机要吃什么,然后是在哪里吃。

    public void Lunch(Dish[] dishes, Location whereToEat)

    8、设计参数列表时,尽量使每个参数都 immutable,因为某些类型的参数,可能会被方法体中的代码更改,而这是不希望的。

    错误:public void RemoveUsers(List<User> users)
    正确:public void RemoveUsers(IEnumerable<User> users)

    9、方法的参数仅供该方法使用,不要传递全局变量或常量。

    10、不要使用非 CLS 规范的参数类型,如 UIntPtr,uint,char* 等。

    希望这些简单的设计准则对您有帮助。


    Mark Zhou
    2010年4月6日 9:44
  • 超过 25 行执行代码的话我这里就报错。我们这里都是 OACR + StyleCop + FxCop,100% 了才能 Check-in。
    Mark Zhou
    2010年4月7日 7:06

全部回复

  • 这个问题属于设计范畴,干建是看您如何定义您的方法。一般说来,方法体中的执行代码不超过 25 行。参数不超过 4 个。参数类型按照方法的名称和意义来定义。

    比如 1,验证用户的方法,这样定义就好:

    public bool AuthenticateUser(string userName, string password)

    2,创建用户的方法,因为用户数据可能很多,这样参数就有可能多于 4 个,达到十几个 (比如姓名,性别,年龄,出生日期,身份证号码等,但有时候又不是所有信息必填),这时,需要采用 Entity 模式,即将这些数据构成一个实体类型,然后将此实体类型作为参数。

    public bool CreateUser(User user)

    3、尽量不要在非 Interop 下使用可选参数,比如

    public int Add(int a, int b, int c = 0)

    是没有必要的,尽量考虑重载。如

    public int Add(int a, int b)
    public int Add(int a, int b, int c)

    4、参数类型要清晰,该用 int 时用 int,该枚举就枚举,该 Uri 就 Uri,比如

    public Stream DownloadFileFromUrl(Uri location, string fileName, string contentType, int contentLength)

    5、在某些场合请考虑可空类型,比如,一个从 QueryString 传递过来的值。

    [HttpGet]
    public ActionResult Index(int? pageIndex)

    6、弄清楚 Guid 和 int,比如,数据库 Entity 类型上的主键,尽量用 Guid。

    public Product GetProduct(Guid productId)

    7、参数的排序也很重要,最直接并最能想到的放前面。比如,吃饭,先要告诉计算机要吃什么,然后是在哪里吃。

    public void Lunch(Dish[] dishes, Location whereToEat)

    8、设计参数列表时,尽量使每个参数都 immutable,因为某些类型的参数,可能会被方法体中的代码更改,而这是不希望的。

    错误:public void RemoveUsers(List<User> users)
    正确:public void RemoveUsers(IEnumerable<User> users)

    9、方法的参数仅供该方法使用,不要传递全局变量或常量。

    10、不要使用非 CLS 规范的参数类型,如 UIntPtr,uint,char* 等。

    希望这些简单的设计准则对您有帮助。


    Mark Zhou
    2010年4月6日 9:44
  • 25行,似乎这个有点苛刻哦,随便写一个事务就能上250行……
    霸王
    2010年4月6日 18:48
  • 25行,似乎这个有点苛刻哦,随便写一个事务就能上250行……
    霸王
    2010年4月6日 18:48
  • 多谢各位大侠指教,明白不少嘿嘿

    2010年4月7日 2:12
  • 超过 25 行执行代码的话我这里就报错。我们这里都是 OACR + StyleCop + FxCop,100% 了才能 Check-in。
    Mark Zhou
    2010年4月7日 7:06