我陷入了设计问题。 我的问题是我对这个问题的解决方案并不干净。代码看起来不太好。
这就是我想要做的事情:
我有一个普通的类,其中包含存储值的属性。 类值必须验证某些规则。
这是一个简化的例子: 值类:
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)
我正在寻找的是一个很好的设计模式。 或者更简洁的方法呢?
最诚挚的问候 弗雷德里克
答案 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)之间存储数据,或者对象的属性必须遵守某些规则(即模型)或其他类似业务对象的对象。也有一些行为。
看来你的可能会属于“模特”类别。除了这里提供的答案,您还可以考虑诸如
之类的解决方案