设计对象的许多不同更新?

时间:2017-03-20 14:50:11

标签: c# .net oop design-patterns

我陷入了设计问题。 我的问题是我对这个问题的解决方案并不干净。代码看起来不太好。

这就是我想要做的事情:

我有一个普通的类,其中包含存储值的属性。 类值必须验证某些规则。

这是一个简化的例子: 值类:

getElementByClassName

验证/更新是在类这样的类中完成的:

srchString = "Debit"
Set rng = Worksheets("Rulebook_Temp").Cells.find(What:=srchString, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False)

我正在寻找的是一个很好的设计模式。 或者更简洁的方法呢?

最诚挚的问候 弗雷德里克

4 个答案:

答案 0 :(得分:0)

使用私有变量和get / set实现完全实现您的属性。然后你可以在set方法中进行检查。例如:

private object _agreementId;
public object AgreementId 
{ 
    get { return _agreementId; } 
    set 
    { 
        if( !CheckIfValidAgreementId(value)) 
            throw new ArgumentException(); 
        _agreementId = value; 
    } 
}

答案 1 :(得分:0)

就个人而言,我喜欢用于验证情况的一种模式是创建ValidationResults类,并将其作为我的对象上的Validate和Update函数的返回值。像这样的东西(超级简单的例子):

public class ValidationResult
{
  public bool IsValid { get; set; }
  public string Message { get; set; }
}

然后,我可能只是在ReceivedOrder类上定义一个Validate方法来返回这个类的实例:

public ValidationResult Validate()
{
  var result = new ValidationResult();
  result.IsValid = true;

  if (!CheckIfValidAgreementId(this.AgreementId))
  {
    result.IsValid = false
    result.Message = "Invalid agreement ID";
  }
  else if (!CheckIfValidProductId(this.ProductId))
  {
    result.IsValid = false;
    result.IsValid = "Invalid product ID";
  }

  // ... and so on, with other validations

  return result;
}

然后我可能会在对象上创建一个Update方法,这样可以确保验证发生,并将结果传回来

public ValidationResult Update()
{
  var validationResult = this.Validate();

  if (validationResult.IsValid)
  {
    // ... your code to actually update the repository goes here
  }

  return validationResult;
}

现在,在其余代码中,您可以在单个对象上调用Update,并检查返回的result.IsValid以验证更新是否成功。如果你需要更新倍数,你可以循环它们。

foreach (ReceivedOrder o in RecivedDocument.Orders)
{
  var result = o.Update();

  if (!result.IsValid)
    MessageBox.Show("failed to update order: " + result.Message); // or however you need to handle this
}

或者,您可以在调用Update之前自己调用Validate,如果这更适合您的用例

foreach (ReceivedOrder o in RecivedDocument.Orders)
{
  var result = o.Validate();

  if (!result.IsValid)
    MessageBox.Show("validation failed: " + result.Message);
  else
    o.Update();
}

答案 2 :(得分:0)

您可以按照以下方式编写应用程序代码:

foreach (RecivedOrder o in RecivedDocument.Orders) 
{
  if (!ReciveOrder.Check()) 
  {
     ... // Display order content on console
         // Then show errors:
     for (int i=0;i<Errors.Count;i++) Console.Writeline(Errors[i]) ;
  } 

class RecivedOrder
 {
   // your properties
   internal List<String> Errors = null ;

   internal bool Check()
   {
     Errors = new List<String>() ;
     CheckAgreementId() ;
     CheckProductId() ;
     ... // other checks
     return Errors.Count==0 ;
   }

   internal void CheckAgreementId()
   {
     bool IdOk = AgreementId>=0 ;
     ... // more controls on AgreementId
     if (!IdOk) Errors.Add("Invalid AgreementId="+AgreementId) ;   
   }

    internal void CheckProductId()
   {
     ... 

答案 3 :(得分:0)

我发现在设计对象时定义类的用途很有帮助。例如,这是一个表示数据库实体或对象的对象,用于简单地在点(即DTO)之间存储数据,或者对象的属性必须遵守某些规则(即模型)或其他类似业务对象的对象。也有一些行为。

看来你的可能会属于“模特”类别。除了这里提供的答案,您还可以考虑诸如

之类的解决方案