SOLID - 违反开闭原则

Posted

技术标签:

【中文标题】SOLID - 违反开闭原则【英文标题】:SOLID - Violated Open-Closed principle 【发布时间】:2018-09-10 17:23:08 【问题描述】:

我有以下代码sn-p

class Vehicle

 public String brand;
 public double price;
 public int productionYear;

 public String toString(String formatType) 
   switch(formatType) 
     case "JSON": // JSON formatting here
        return jsonFormattedString;
        break;
     case "XML": // XML formatting here
        return xmlFormattedString;
        break;
     default: // default formatting
       return defaultFormattedString;
    

我相信这种方法的问题是需要改变 行为改变时的源代码(另一种格式类型); 以及我错过的其他 SOLID 违规行为。

如何更好地实施?

【问题讨论】:

这个类的职责是什么? 违反严格是关于 'toString' 方法.. 我试图说明的一点是,在你有一个有意义的课程之前,不要被 SOLID 所困。这是一个没有任何行为的“哑”类。甚至可以争论为什么要开设这个课程。如果您想在某个地方保存可以序列化为 JSON、XML 等的数据,请构建一组对Map ojbects 进行序列化的类。您可以根据序列化需求的变化派生新的类。 【参考方案1】:

我要做的是介绍另一个用于“导出”您的车辆的类。

类似的东西。

public class VehicleExporter

    public string ExportAsJson(Vehicle vehicle)
    
        // Do the JSON thing
    

    public string ExportAsXML(Vehicle vehicle)
    
        // Do the XML thing
    

你的设计最重要的不是打破开放封闭原则,而是车辆类的责任。

当您的班级执行 toString() 时,它实际上是在尝试做一些超出其职责范围的事情。

如果我可以进一步澄清,请告诉我。

【讨论】:

以上是关于SOLID - 违反开闭原则的主要内容,如果未能解决你的问题,请参考以下文章

带构造函数的开闭原理

利用开闭原则 (SOLID)

LARAVEL:如何使用 SOLID 原则的开闭原则?

使用接口实现开闭原则(SOLID)

如何应用 SOLID 原则在 React 中整理代码之开闭原则

如何应用 SOLID 原则在 React 中整理代码之开闭原则