Oop 固体违反开闭原理

Oop 固体违反开闭原理,oop,principles,open-closed-principle,Oop,Principles,Open Closed Principle,我有以下代码片段 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;

我有以下代码片段

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;
    }
}
我认为这种方法的问题在于需要改变 行为改变时的源代码(另一种格式类型); 也许还有我错过的其他实质性违规


如何更好地实现这一点?

我要做的是引入另一个类来“导出”您的车辆

像这样的

public class VehicleExporter
{
    public string ExportAsJson(Vehicle vehicle)
    {
        // Do the JSON thing
    }

    public string ExportAsXML(Vehicle vehicle)
    {
        // Do the XML thing
    }
}
你的设计最大的问题不是打破开闭原则,而是车辆类别的责任

当您的类执行toString()时,它实际上是在尝试执行超出其职责范围的操作


请让我知道我是否可以进一步澄清。

这个类的责任是什么?违反严格意义上的“toString”方法。我想说的是,在你有一个有意义的类之前,不要被SOLID所束缚。这是一个没有任何行为的“哑”类。人们甚至可以争论为什么要上这门课;如果您想在某个地方保存可以序列化为JSON、XML等的数据,请构建一组类来执行
Map
ojbects的序列化。随着序列化需求的变化,您可以派生新类。