Tag: open closed principle

开放/封闭原则 – 如何处理此交换机?

我一直在研究开放的闭合原理,听起来不错,所以我想练习它的教导。 我看着将我新发现的知识应用到现有项目中,并立即变得有点卡住。 如果出现了新的UserType(这很可能),则需要更改,尚未关闭修改。 怎么能绕过这个呢? 从我所看到的,听起来我应该在这里实施工厂而不是应用OCP? 打破封闭原则的工厂 private void BuildUserTree(User user) { switch (user.UserType) { case UserType.FreeLoader: BuildFreeLoaderTree(); break; case UserType.Premium: BuildPremiumTree(); break; case UserType.Unlimited: BuildUnlimitedTree(); break; default: throw new Exception(“No UserType set”); } } 谢谢,Kohan

扩展List 并违反开放/封闭原则

我刚刚在我的一个类中创建了以下方法 public static bool Assimilate(this List first, List second) { // Trivial if (first.Count == 0 || second.Count == 0) { return false; } // Sort the lists, so I can do a binarySearch first.Sort(); second.Sort(); // Copia only the new elements int index; for (int i = 0; i < second.Count; i++) { index […]

超越开放原则

我有一个简单的程序,它根据用户提供的鼠标数据绘制几何图形。 我有一个处理鼠标跟踪的类(它获取带有鼠标移动历史的List)和一个名为Shape的抽象类。 在这个类中,我对一些额外的形状进行了简化,比如Circle,Rectangle等 – 并且它们中的每一个都会覆盖抽象的Draw()函数。 这一切都运行良好,但问题来自我希望用户能够手动切换所需的形状。 我得到了鼠标数据,我知道应该绘制什么样的形状。 问题是如何使代码“知道”它应该创建哪个对象并将适当的参数传递给构造函数。 此时也不可能添加新的Shape衍生物,这是完全错误的。 我好像不想出来像这样的代码: List Shapes = new List(); // somwhere later if(CurrentShape == “polyline”){ Shapes.Add(new Polyline(Points)); } else if (CurrentShape == “rectangle”){ Shapes.Add(new Rectangle(BeginPoint, EndPoint)); } // and so on. 上面的代码清楚地certificate了开放 – 封闭原则。 问题是我没有任何好主意如何克服它。 主要问题是不同的Shapes具有不同参数的构造函数,这使得它更加麻烦。 我很确定这是一个常见的问题,但我不知道如何克服它。 你有什么想法吗?

在多个接口实现中打破SOLID原则

我在factory方法中面临依赖倒置的问题,并且它也打破了Open Closed原则。 我的代码看起来像下面的代码 public interface IWriter { void WriteToStorage(string data); } public class FileWriter : IWriter { public void WriteToStorage(string data) { //write to file } } public class DBWriter : IWriter { public void WriteToStorage(string data) { //write to DB } } 现在我使用工厂类来解决对象创建问题。 它看起来像下面的代码 public interface IFactory { IWriter GetType(string outputType); } public class […]

理解开放封闭原则

当我遇到以下代码时,我正在重构 一个简单的脚本文件解析器的旧代码: StringReader reader = new StringReader(scriptTextToProcess); StringBuilder scope = new StringBuilder(); string line = reader.ReadLine(); while (line != null) { switch (line[0]) { case ‘$’: // Process the entire “line” as a variable, // ie add it to a collection of KeyValuePair. AddToVariables(line); break; case ‘!’: // Depending of what comes after the ‘!’ […]