两个不同的方法或附加参数?

时间:2017-10-18 11:39:13

标签: c#

我在POCO实体中设置了一个方法,用于设置基本属性和导航属性。在某些情况下,我不需要验证某些条件,但在另一种情况下,我需要验证以确保数据库中的信息一致,但此验证使我从数据库中获取额外的数据。

所以到目前为止我的基本方法是:

public void setMyProperty(MyType paramProperty)
{
    this.Property = paramProperty;
    this.IDProperty = paramProperty.IDPorperty;
    paramProperty.MyNavigationCollection.Add(this);
}

对于验证数据的方法,我想我有两个选择。

首先,我可以为业务逻辑创建一种新方法,类似于:

public void setPropertyBi(MyType paramProperty)
{
   //check conditons
   //If all OK then
   this.setPorperty(paramProperty);
}

但我有另一个选择,只使用一种方法,而不是基本方法,另一种方法用于业务检查。这样的事情:

public void setProperty(MyType paramType, bool paramDoChecks)
{
    if(paramDoChecks)
    {
        //Do checks
    }


    //if all OK
    this.Property = paramProperty;
    this.IDProperty = paramProperty.IDPorperty;
    paramProperty.MyNavigationCollection.Add(this);
}

推荐选项是哪个?或者还有其他方法?

4 个答案:

答案 0 :(得分:3)

这里的人似乎更喜欢国旗,我个人认为这很可怕 你想要实现两件事:只需设置一个属性;验证并设置属性。恕我直言,它应该是两种分开的方法。

答案 1 :(得分:0)

如果它是一个equaly功能,请不要写两个不同的方法。只需添加一个参数,它就像你上次写的那样产生验证差异。 但如果验证失败,请不要忘记输入行为。将它分开。

答案 2 :(得分:0)

您可以向passport.serializeUser(function(user, done) { //We can identify the user uniquely by the CN, //so we only serialize this into the session token. done(null, user.cn); }); passport.deserializeUser(function(cn, done) { //Directly query LDAP. //I'm not sure passport caches the result (only calls deserializeUser for new sessions) //but worst case you can cache the result yourself. somehowLoadUserFromLDAPByCN(cn, function(err, user) { done(err, { userId: user.cn, displayName: user.displayName }); }); }); 添加一个布尔ValidationRequired属性,您可以在调用MyType之前设置该属性。

答案 3 :(得分:0)

我更喜欢有两种方法: CanSetProperty SetProperty

  • CanSetProperty :只需检查条件,不会更改参数中的任何内容。
  • SetProperty :将修改参数。

我认为此代码是遵循Command Query Separation Pattern

的合适人选
  

基本思想是我们应该将对象的方法划分为   两个截然不同的类别:

     
      
  • 查询:返回结果,不要更改结果的可观察状态   系统(没有副作用)。
  •   
  • 命令:更改a的状态   系统但不返回值。
  •