抽象如何帮助DRY?

时间:2018-02-17 16:08:00

标签: oop dry software-design

当我们搜索"Don't repeat yourself" on Wikipedia时,第一句话是:

  

在软件工程中,不要重复 DRY )是一个原则   软件开发旨在减少软件的重复   模式,用抽象替换它们......

我知道软件工程中的抽象意味着隐藏实现API行为的实现复杂性,但似乎"抽象"这句话不是我以前所知道的。有人可以向我解释抽象意味着什么吗?如果你能给我一个例子,那会更好。

1 个答案:

答案 0 :(得分:1)

  

我知道软件工程中的抽象意味着隐藏   实现API行为实现的复杂性

是的,这意味着(absstraction@wikipedia)和同样的概念也可以用来减少重复!或者换句话说,它可以用来练习DRY。

让我试着通过一个例子解释一下。首先,我将展示非DRY代码(没有抽象),然后使用抽象我尝试减少重复。

假设您希望根据申请人填写的申请表格详细信息构建电子邮件视图模型,并且有一个电子邮件视图类,它使用此emailViewModel来显示申请表中的所有非空详细信息。您可以像下面的示例(第一次尝试)一样编写它

public class ApplicationForm
{
        public AddressDetail AddressDetail { get; set; }
        public CustomerDetail CustomerDetail { get; set; }
        public ProductDetail ProductDetail { get; set; }
}

public class EmailViewModel
{
    public EmailViewModel(ApplicationForm applicationForm)
    {
        Address = GetAddressDetail(applicationForm.AddressDetail);
        Customer = GetCustomerDetail(applicationForm.CustomerDetail);
        Product = GetProductDetail(applicationForm.ProductDetail);
    }

    public string Address { get; set; }
    public string Customer { get; set; }
    public string Product { get; set; }
}

//view code assume razor view
@if(Model.Address!=null)
{
    // method for showing address
}
@if(Model.Customer!=null)
{
    // method for showing customer
}
//and other properties

我保持代码非常简单;只有三个属性和避风港显示转换方法的声明。如果有50个房产怎么办?在第一种方法中,你将在三个地方进行繁琐的改变。现在,我将向您展示如何创建一个实现DRY的接口(一种抽象方式)的第二个示例代码。

    interface IFormDetail
{
    IFormDetailView GetDetail();
}
interface IFormDetailView
{
    string ShowView();
}

public class ApplicationForm
{
        public List<IFormDetail> FormDetails {get;set;}
}

public class EmailViewModel
{
    public EmailViewModel(ApplicationForm applicationForm)
    {
        if(applicationForm.FormDetails!=null)
        {
            FormDetails = new List<IFormDetailView>();
            foreach(var detail in applicationForm.FormDetails)
            {
                FormDetails.Add(detail.GetDetail());
            }
        }
    }

    public List<IFormDetailView> FormDetails { get; set; }

}

//view code assume razor view
@f(Model.FormDetails!=null)
{
    foreach(var detail in Model.FormDetails){
        detail.ShowView();
    }
}

在第二个代码示例中,当您拥有新属性时,您只会在创建新的应用程序表单属性时进行一次更改。

因此,虽然我们隐藏了细节呈现方式等的复杂性,但我们也在利用它来减少重复。