叶在综合模式实现了Component接口,包括Add,Remove,和GetChild方法,一个叶是永远不会使用.这似乎违反了接口隔离原则.
那么复合模式SOLID的用法是什么?
链接到Composite Pattern:http://www.dofactory.com/Patterns/PatternComposite.aspx
design-patterns liskov-substitution-principle composite solid-principles interface-segregation-principle
我一直在阅读SOLID原则,并想知道在DOTNET中是否有一个很好的大型开源应用程序或项目,它显示了在现实世界产品中使用的SOLID原则.
如果有任何其他开源项目被认为是良好的编码样本,我也很想看到它们.
我的团队在使用自制的DI容器在PHP项目中实现依赖注入时感到困惑.我们对DI的第一次迭代可能是极端的,甚至异常也被注入依赖于它们的类中.
这是一个好习惯还是矫枉过正?
LSP说"派生类型不能改变基类型的行为",换言之,"派生类型必须完全可替换它们的基类型".
这意味着如果我们在基类中定义虚方法,我们就违反了这个原则.
此外,如果我们使用new关键字在驱动方法中隐藏方法,那么我们又违反了这个原则.
换句话说,如果我们使用多态,我们就违反了LSP!
在许多应用程序中,我在基类中使用了虚方法,现在我意识到它违反了LSP.此外,如果你使用模板方法模式,你违反了这个原则,我已经使用了很多.
那么,当你需要继承并且你也想从多态中受益时,如何设计符合这个原则的应用程序呢?我糊涂了!
请参阅此处的示例:http://www.oodesign.com/liskov-s-substitution-principle.html
c# polymorphism liskov-substitution-principle solid-principles
维基百科以这种方式描述单一责任原则:
单一责任原则规定每个对象应该只有一个责任,并且该责任应该由类完全封装.其所有服务应与该责任严格一致.
MVC中控制器的传统使用似乎导致程序员违反了这一原则.拿一个简单的留言簿控制器和视图.控制器可能有两个方法/操作:1)Index()和2)Submit().Index()显示表单.Submit()处理它.这两种方法是否代表两种不同的责任?如果是这样,单一责任如何进入?
model-view-controller single-responsibility-principle solid-principles
适配器设计模式用于将类(Target)的接口转换为客户期望的另一个接口(Adaptee).适配器允许不兼容的类一起工作,否则由于它们的不兼容接口而无法工作.
适配器模式可以通过两种方式实现:继承(适配器模式的类版本)和组合(适配器模式的对象版本).
我的问题是关于使用继承实现的适配器模式的类版本.
以下是绘图编辑器的示例:

interface Shape
{
Rectangle BoundingBox();
Manipulator CreateManipulator();
}
class TextView
{
public TextView() { }
public Point GetOrigin() { }
public int GetWidth() { }
public int GetHeight() { }
}
interface Shape
{
Rectangle BoundingBox();
Manipulator CreateManipulator();
}
class TextView
{
public TextView() { }
public Point GetOrigin() { }
public int GetWidth() { }
public int GetHeight() { }
}
Run Code Online (Sandbox Code Playgroud)
我们想重用TextView类来实现TextShape,但是接口是不同的,因此,TextView和Shape对象不能互换使用.
是否应该更改TextView类以符合形状界面?也许不是.
TextShape可以通过以下两种方式之一使TextView接口适应形状的界面:
类适配器

interface Shape
{
Rectangle BoundingBox();
Manipulator …Run Code Online (Sandbox Code Playgroud) design-patterns liskov-substitution-principle adapter solid-principles
我可以通过封装,依赖注入,最少知识原则,你不需要它来掌握"做一件事"的部分; 但我怎么理解第二部分"做得好"?
给出的一个例子是完整性的概念,在同一篇YAGNI文章中给出:
例如,在允许添加项目,删除项目或修改项目的特征中,可以使用完整性来推荐"重命名项目".
但是,我发现这样的推理很容易被滥用到特征蠕变中,从而违反了"做一件事"的部分.
因此,看到相当一个特征属于"做得好"类别(因此,将其包含在函数/类/程序中)或其他"做一件事"类别(因此,排除它)的试金石是什么? ?
第一部分,"做一件事",最好通过UNIX的ls命令来理解,因为它包含了过多的标志来格式化它的输出,这些标志本应完全委托给另一个外部程序.但我没有一个很好的例子来看第二部分"做得好".
什么是一个很好的例子,删除任何进一步的功能将使它不"做得好"?
我从MVC3开始,想要使用一些灵活的架构,所以我读了几十篇博客,一本书(Pro ASP.NET MVC 3),阅读了有关SOLID原理的内容,最后得到了一个我喜欢的应用程序结构(或者至少我是这么认为的,到目前为止,因为我还没有建立任何东西):

在这个结构中:
Domain using Services的主要原因是验证POCO(IValidatable)类的Validate方法的唯一键.
我开始用这种结构构建一个参考应用程序,但到目前为止,我遇到了两个问题:
我正在使用Data.Tests项目和存储库的单元测试,但是还没有找到一种方法来注入(使用Ninject)服务的实现(在构造函数中或其他方面),因此Validate方法可以在服务上调用CheckUniqueKey.
我还没有找到关于将Ninject连接到TEST项目的任何参考(很多用于WebUI项目).
我想在这里实现的目标是通过改变DATA组件,能够从EF切换到其他类似DAPPER的东西.
UPDATE
现在(截至2011年8月9日)Ninject正在工作,但我想我错过了一些东西.
我有一个带有两个构造函数的CustomerRepository:
public class CustomerRepository : BaseRepository<Customer>, ICustomerRepository
{
// The repository usually receives a DbContext
public CustomerRepository(RefAppContext context)
: base(context)
{
}
// If we don't receive a DbContext then we create the repository with a defaulte one
public CustomerRepository()
: base(RefApp.DbContext())
{
}
...
}
Run Code Online (Sandbox Code Playgroud)
在TestInitialize上:
// These are for testing the Repository against a test database
[TestInitialize()]
public …Run Code Online (Sandbox Code Playgroud) 我想将数据与数据源分开.一个用于数据库交互的类和用于数据操作的类.但是我的方法违反了LSP:preconditions cannot be strengthened in a subtype 并引发了严格的错误:Declaration of DataRepositoryItem::save() should be compatible with DataRepositoryAbstract::save(DataAbstract $data)
class DataAbstract {
}
class DataItem extends DataAbstract {
}
class DataObject extends DataAbstract {
}
abstract class DataRepositoryAbstract {
/** @return DataAbstract */
public function loadOne(){}
/** @return DataAbstract[] */
public function loadAll(){}
public function save(DataAbstract $data){}
}
class DataRepositoryItem extends DataRepositoryAbstract {
/** @return DataItem */
public function loadOne(){}
/** @return DataItem[] */
public function loadAll(){}
public function …Run Code Online (Sandbox Code Playgroud) php oop inheritance liskov-substitution-principle solid-principles
我是OOP的新手并学习设计模式所以我写了一些简单的代码来试用一个Factory方法,一切看起来都不错,除非我想添加另一个子类型.这是迄今为止的代码:
public interface Person {
public String getDescription();
}
public class Adult implements Person {
@Override
public String getDescription() {
return "I am an ADULT";
}
}
public class Child implements Person {
@Override
public String getDescription() {
return "I am a CHILD";
}
}
public class PersonFactory {
public Person create(int age) {
if (age < 18) return new Child();
return new Adult();
}
}
public class ClientA {
public static void main(String[] args) {
PersonFactory personFactory = new …Run Code Online (Sandbox Code Playgroud) solid-principles ×10
liskov-substitution-principle ×4
c# ×2
oop ×2
single-responsibility-principle ×2
adapter ×1
architecture ×1
composite ×1
inheritance ×1
interface-segregation-principle ×1
java ×1
ninject ×1
open-source ×1
php ×1
polymorphism ×1
yagni ×1