Liskov Substitution Principleをチェックしてください。つまり、同じ抽象化の 2 つの具体的な実装は交換可能でなければなりません。サンプルで XLS を CSV 実装に交換する場合は、ソース コードを変更する必要があります。
// Some client code
// it has to be aware of differing implementations, so if this changes to CSV
// this code changes
File exported = XLS.export(columnNames, dbNames);
静的メソッドを使用するよりも、XLSExporter と CSVExporter の両方が同じ基本クラスから派生し、まったく同じインターフェイスを持つアプローチを好みます。私はJavaの男ですが、アイデアを得ることができるはずです:
public interface Exporter {
public File export();
}
public class XLSExporter implements Exporter {
public XLSExporter(String[] columns, String[] databases) // specifics go in constructor
public File export() // ...
}
public class CSVExporter implements Exporter {
public CSVExporter(String delim, String[] columns, String[] databases) // specifics go in constructor
public File export() // ...
}
これで、エクスポーターのクライアントは異なる引数を認識する必要がなくなりました。彼らは手渡されたものをそのままエクスポートします。これにより、コードが柔軟で保守しやすくなります。
// new client code
// doesn't care about what kind of exporter it is, it just executes what it's given
File exported = exporter.export();