接口应该公开对象或对象本身的属性

时间:2017-10-06 13:42:00

标签: c# interface coding-style standards

我想知道,设计具有特定意图的界面的最佳做法是什么? 例如,假设我想实现一个接口,将对象标记为可通过电子邮件发送,IEmailable。最好在ConvertToEmail()的接口上只有一个方法,它将返回一个类型为Email的对象,主题为& body设置,或者更好的是具有Address,Body,Subject的接口属性,因此使用该接口处理对象的方法可以操作&按照自己的意愿创建电子邮件?

1 个答案:

答案 0 :(得分:0)

将电子邮件功能拆分为自己的界面和类可能是值得的,例如

public interface IEmailConverter<T>
{
    Email ConvertToEmail(T source)
}

我会留下地址和主题。原因是

  • 如果您发送电子邮件的详细信息发生变化,那么无论您要发送电子邮件的对象都不必更改。
  • 在某些时候,您可能需要多种方法来通过电子邮件发送同一个班级。如果该类“拥有”自己的电子邮件转换,那么就无法支持它。
  • 在不知道确切细节的情况下,生成电子邮件可能是一个单独的责任,无论班级主要做什么。

更进一步 - 如果您将对象格式化为电子邮件,然后发现您想要做的不仅仅是通过电子邮件发送,该怎么办?也许将对象格式化为文本应该是它自己的责任,比如

public interface ITextFormatter<T>
{  
    string ConvertToText(T source)
}

然后其他步骤 - 添加主题,地址,其他文本等 - 将更加可重用。只有与对象本身相关的部分 - 将其值提取到文本消息中 - 才属于新类。

甚至有一种默认实现在某些情况下可能会起作用(取决于您的类的外观以及覆盖ToString是否有意义。)

public class TextFormatter<T> : ITextFormatter<T>
{
    public virtual string ConvertToText(T source)
    {
        return source.ToString();
    }
}

然后您可以根据需要创建替代实现,例如

public class FooPlainTextFormatter : ITextFormatter<Foo>

public class FooHtmlFormatter : IHtmlFormatter<Foo>