在什么时候,YAGNI应该优先于良好的编码习惯,反之亦然?我正在研究一个正在工作的项目,并希望向我的同事缓慢介绍良好的代码标准(目前还没有,并且一切都只是某种形式而没有韵律或理由),但是在创建了一系列类之后(我们不要做TDD,或者根本不进行任何类型的单元测试。)我退后一步认为这违反了YAGNI,因为我非常确定地知道我们不需要扩展其中的某些类。
这是我意思的一个具体示例:我有一个数据访问层,其中包装了一组存储过程,该过程使用具有基本CRUD功能的基本存储库样式模式。由于所有存储库类都需要几种方法,因此我为存储库创建了一个通用接口,称为IRepository
。但是,然后我为每种类型的存储库(例如ICustomerRepository
)创建了一个“标记”接口(即,没有添加任何新功能的接口),具体类实现了该接口。我已经通过Factory实现完成了同样的事情,以便从存储过程返回的DataReaders / DataSets中构建业务对象。我的存储库类的签名通常看起来像这样:
public class CustomerRepository : ICustomerRepository
{
ICustomerFactory factory = null;
public CustomerRepository() : this(new CustomerFactory() { }
public CustomerRepository(ICustomerFactory factory) {
this.factory = factory;
}
public Customer Find(int customerID)
{
// data access stuff here
return factory.Build(ds.Tables[0].Rows[0]);
}
}
我在这里担心的是,我违反了YAGNI,因为我有99%的确定性知道,除了CustomerFactory
向该存储库提供具体内容外,没有其他理由。因为我们没有单元测试,所以我不需要任何MockCustomerFactory
类似的东西,并且拥有如此多的界面可能会使我的同事感到困惑。另一方面,使用工厂的具体实现方式似乎具有设计异味。
在适当的软件设计与不过度设计解决方案之间是否有折衷的好方法?我在问我是否需要所有“单一实现接口”,或者是否可以牺牲一些好的设计,而仅拥有例如基本接口和单个具体的接口,而不用担心对该接口进行编程接口(如果实现的话)将被使用。