标签: solid-principles

复合模式是SOLID吗?

叶在综合模式实现了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

11
推荐指数
2
解决办法
2389
查看次数

真实世界的Opensource c#应用程序显示了良好的代码

我一直在阅读SOLID原则,并想知道在DOTNET中是否有一个很好的大型开源应用程序或项目,它显示了在现实世界产品中使用的SOLID原则.

如果有任何其他开源项目被认为是良好的编码样本,我也很想看到它们.

c# open-source solid-principles

11
推荐指数
1
解决办法
1051
查看次数

在实现依赖注入时,是否应该注入异常?

我的团队在使用自制的DI容器在PHP项目中实现依赖注入时感到困惑.我们对DI的第一次迭代可能是极端的,甚至异常也被注入依赖于它们的类中.

这是一个好习惯还是矫枉过正?

oop dependency-injection solid-principles

11
推荐指数
1
解决办法
1350
查看次数

如何遵守Liskov的替换原则(LSP)并仍然受益于多态性?

LSP说"派生类型不能改变基类型的行为",换言之,"派生类型必须完全可替换它们的基类型".

这意味着如果我们在基类中定义虚方法,我们就违反了这个原则.

此外,如果我们使用new关键字在驱动方法中隐藏方法,那么我们又违反了这个原则.

换句话说,如果我们使用多态,我们就违反了LSP!

在许多应用程序中,我在基类中使用了虚方法,现在我意识到它违反了LSP.此外,如果你使用模板方法模式,你违反了这个原则,我已经使用了很多.

那么,当你需要继承并且你也想从多态中受益时,如何设计符合这个原则的应用程序呢?我糊涂了!

请参阅此处的示例:http://www.oodesign.com/liskov-s-substitution-principle.html

c# polymorphism liskov-substitution-principle solid-principles

11
推荐指数
2
解决办法
4851
查看次数

在MVC中传统使用控制器是否会导致违反单一责任原则?

维基百科以这种方式描述单一责任原则:

单一责任原则规定每个对象应该只有一个责任,并且该责任应该由类完全封装.其所有服务应与该责任严格一致.

MVC中控制器的传统使用似乎导致程序员违反了这一原则.拿一个简单的留言簿控制器和视图.控制器可能有两个方法/操作:1)Index()和2)Submit().Index()显示表单.Submit()处理它.这两种方法是否代表两种不同的责任?如果是这样,单一责任如何进入?

model-view-controller single-responsibility-principle solid-principles

10
推荐指数
1
解决办法
1054
查看次数

适配器模式与Liskov替换

适配器设计模式用于将类(Target)的接口转换为客户期望的另一个接口(Adaptee).适配器允许不兼容的类一起工作,否则由于它们的不兼容接口而无法工作.

适配器模式可以通过两种方式实现:继承(适配器模式的类版本)和组合(适配器模式的对象版本).

我的问题是关于使用继承实现的适配器模式的类版本.

以下是绘图编辑器的示例:

图1:

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接口适应形状的界面:

  1. 通过继承Shape的接口和TextView的实现(适配器模式的类版本)
  2. 通过在TextShape对象中编写TextView实例并使用TextView实例(适配器模式的对象版本)实现TextShape的接口.

类适配器

图2:

interface Shape   
{   
    Rectangle BoundingBox();   

    Manipulator …
Run Code Online (Sandbox Code Playgroud)

design-patterns liskov-substitution-principle adapter solid-principles

9
推荐指数
1
解决办法
2153
查看次数

编写做一件事并做得好的程序

我可以通过封装,依赖注入,最少知识原则,你不需要它来掌握"做一件事"的部分; 但我怎么理解第二部分"做得好"?

给出的一个例子是完整性的概念,在同一篇YAGNI文章中给出:

例如,在允许添加项目,删除项目或修改项目的特征中,可以使用完整性来推荐"重命名项目".

但是,我发现这样的推理很容易被滥用到特征蠕变中,从而违反了"做一件事"的部分.

因此,看到相当一个特征属于"做得好"类别(因此,将其包含在函数/类/程序中)或其他"做一件事"类别(因此,排除它)的试金石是什么? ?

第一部分,"做一件事",最好通过UNIX的ls命令来理解,因为它包含了过多的标志来格式化它的输出,这些标志本应完全委托给另一个外部程序.但我没有一个很好的例子来看第二部分"做得好".

什么是一个很好的例子,删除任何进一步的功能将使它不"做得好"?

single-responsibility-principle yagni solid-principles

9
推荐指数
1
解决办法
739
查看次数

在SOLID应用程序架构中使用Ninject

我从MVC3开始,想要使用一些灵活的架构,所以我读了几十篇博客,一本书(Pro ASP.NET MVC 3),阅读了有关SOLID原理的内容,最后得到了一个我喜欢的应用程序结构(或者至少我是这么认为的,到目前为止,因为我还没有建立任何东西):

在此输入图像描述

在这个结构中:

  • Domain保存POCO类并定义服务接口
  • 服务实现服务接口并定义存储库接口
  • 数据实现了存储库接口
  • WebUI和域使用服务
  • 服务使用存储库
  • WebUI,服务和数据依赖于POCO类的域

Domain using Services的主要原因是验证POCO(IValidatable)类的Validate方法的唯一键.

我开始用这种结构构建一个参考应用程序,但到目前为止,我遇到了两个问题:

  1. 我正在使用Data.Tests项目和存储库的单元测试,但是还没有找到一种方法来注入(使用Ninject)服务的实现(在构造函数中或其他方面),因此Validate方法可以在服务上调用CheckUniqueKey.

  2. 我还没有找到关于将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)

architecture ninject solid-principles asp.net-mvc-3

9
推荐指数
1
解决办法
1437
查看次数

避免违反LSP

我想将数据与数据源分开.一个用于数据库交互的类和用于数据操作的类.但是我的方法违反了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

9
推荐指数
2
解决办法
384
查看次数

在java中扩展参数化工厂方法

我是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)

java factory-method open-closed-principle solid-principles

9
推荐指数
1
解决办法
467
查看次数