Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 抽象在干法英语中有什么帮助?_Oop_Dry_Software Design - Fatal编程技术网

Oop 抽象在干法英语中有什么帮助?

Oop 抽象在干法英语中有什么帮助?,oop,dry,software-design,Oop,Dry,Software Design,当我们搜索时,第一句话是: 在软件工程中,不要重复你自己(DRY)是 旨在减少软件重复的软件开发 模式,用抽象代替它们 我知道软件工程中的抽象意味着隐藏API行为如何实现的实现复杂性,但这句话中的“抽象”似乎不是我以前知道的。有人能给我解释一下抽象在这里意味着什么吗?如果你能给我举个例子就更好了 我知道软件工程中的抽象意味着隐藏 API行为实现方式的实现复杂性 是的,这意味着()和非常相同的概念也可以用来减少重复!或者换句话说,它可以用来练习干燥 让我试着用一个例子来解释这一点。首先,我将展示非

当我们搜索时,第一句话是:

在软件工程中,不要重复你自己(DRY)是 旨在减少软件重复的软件开发 模式,用抽象代替它们

我知道软件工程中的抽象意味着隐藏API行为如何实现的实现复杂性,但这句话中的“抽象”似乎不是我以前知道的。有人能给我解释一下抽象在这里意味着什么吗?如果你能给我举个例子就更好了

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

是的,这意味着()和非常相同的概念也可以用来减少重复!或者换句话说,它可以用来练习干燥

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

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

我将上述代码保持得非常简单;只有三个属性,并且没有显示转换方法的声明。如果有50处房产呢!在第一种方法中,您将在三个地方进行繁琐的更改。现在,我将向您展示如何创建接口(一种抽象方式)的第二个示例代码

    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();
    }
}
接口详细信息
{
IFormDetailView GetDetail();
}
界面详细视图
{
字符串ShowView();
}
公共类申请表
{
公共列表FormDetails{get;set;}
}
公共类EmailViewModel
{
公共EmailViewModel(应用程序表单应用程序表单)
{
if(applicationForm.FormDetails!=null)
{
FormDetails=新列表();
foreach(applicationForm.FormDetails中的变量详细信息)
{
添加(detail.GetDetail());
}
}
}
公共列表FormDetails{get;set;}
}
//视图代码假定为razor视图
@f(Model.FormDetails!=null)
{
foreach(Model.FormDetails中的var详细信息){
detail.ShowView();
}
}
在第二个代码示例中,当您有一个新属性时,在创建一个新的应用程序表单属性时,只需进行一次更改


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

隐藏实现细节不是封装abstraction@apokryfos好的,我将实现细节更改为实现复杂性,这仍然不是抽象。抽象中没有隐藏的东西。这只是简化了一下。@apokryfos那么,这篇文章中投票率最高的答案是错的吗?不知道为什么会被否决。对于那些标签来说,这是一个合理的问题,尽管这可能只是对术语的误解。
    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();
    }
}