我们的代码库的一部分以以下样式编写:
// IScheduledTask.cs
public interface IScheduledTask
{
string TaskName { get; set; }
int TaskPriority { get; set; }
List<IScheduledTask> Subtasks { get; set; }
// ... several more properties in this vein
}
// ScheduledTaskImpl.cs
public class ScheduledTaskImpl : IScheduledTask
{
public string TaskName { get; set; }
public int TaskPriority { get; set; }
public List<IScheduledTask> Subtasks { get; set; }
// ... several more properties in this vein,
// perhaps a constructor or two for convenience.
}
也就是说,有大量的接口仅指定一组属性而没有任何行为,每个接口都有一个唯一的实现,这些实现通过自动属性来实现。该代码是由相当资深的人(比我本人要多)编写的,除了这种使用接口的合理过程代码之外。我想知道是否还有其他人遇到过/使用过这种样式,并且它是否比在没有接口的地方仅使用具体的DTO有什么优势?
1
我这样做的原因之一是出于COM兼容性的考虑,但这似乎并不是您的原因。
—
麦克
@Mike有趣的是,我从未使用过COM,并且在这里未使用过。我将询问代码这一部分的作者是否打算使用COM或其他任何东西。
—
walpen '16
我的猜测是,他希望在相对不久的将来使这些属性中的至少一个成为非自动属性,并且一开始就写出这个样板是他养成节省一些时间的习惯,尽管我不是C#的人,这就是我能说的。
—
Ixrec
恕我直言,这是过度痴迷和错误地将代码应用于接口而不是实现。一个关键的故事是唯一的实现。接口的意义是多态性,但是从某种意义上说,仅具有属性的类就是通过具有不同的值来实现的。即使具有行为-方法-单一实现也无济于事。废话遍布我们的代码库,充其量它妨碍维护。我浪费太多时间问为什么,什么,在哪里。他们为什么这样做,我看不到什么设计,其他实现在哪里?
—
radbobob
前面的大多数评论都涉及过早抽象的单个实现“代码味道”。但是,这里也有一个贫血的域模型“代码气味”,请参阅:martinfowler.com/bliki/AnemicDomainModel.html
—
Erik Eidt,2016年