2

チームに単一責任原則を提示してプロジェクトで使用するセミナーを開催しました。私は、次の一般的な例を使用 :単体責任原則を使用する代わりに、クラスに新しいメソッドを追加する必要があります

class Employee: 
    save() 
    calculate_salary() 
    generate_report() 

をそして私はすべてが、このクラスで大丈夫であるかどうかを伝えるためにチームを尋ねました。誰もそれは大丈夫だと私に言った。 しかし、私はここでSRP原則の3つの違反を見る。 私はクラスからすべてのメソッドを抽出する必要があると言えばいいですか? 私の推論:

save()メソッドは、私たちのデータベースを変更した場合に変更の理由です。

給与ポリシーが変更される可能性があるため、calculate_salary()メソッドが変更の理由です。

レポートのプレゼンテーション(htmlの代わりにcsv)を変更する場合は、generate_report()メソッドを変更する必要があります。

最後の方法を考えてみましょう。私は次のHtmlReportGeneratorクラスを思いついた。

class HTMLReportGenerator: 
    def __init__(self, reportable): 
     self.reportable = reportable 

    def generate_csv_report() 

class CSVReportGenerator: 
    def __init__(self, reportable): 
     self.reportable = reportable 

    def generate_html_report() 

このジェネレータのビジネスロジックが変更されても、Employeeクラスには触れず、これが私の主なポイントでした。さらに、これらのクラスをEmployeeクラスオブジェクト以外のオブジェクトに再利用できるようになりました。チームは別のクラスを思い付いた

しかし:

class Employee: 
    save() 
    calculate_salary() 
    generate_html_report() 
    generate_csv_report() 

彼らはSRPに違反していることを理解し、それが彼らのために大丈夫です。

そして、私が)のために戦うためには他のアイデアを持っていた場所です)

状況上の任意のアイデアは?

+2

"彼らは彼らがSRPに違反していることを理解しています"。彼らがこれを理解しているとはほとんど信じられない。 SRPは終わりの手段です。この目的は保守性です。このような小さなサンプルを孤立して見ると、クラスを分割するメリットが見えにくいことがよくあります。 – Steven

+0

はい。システムが成長すると問題が生じることは明らかです。しかし、彼らは、あらゆる種類のレポートに新しいクラスを作成することは大変だと考えています。毎回新しいメソッドを追加するほうが簡単です。 –

+0

この質問はおそらくSOではなくプログラマに属している可能性があります。 – plalx

答えて

1

私は、SRPとオープン/クローズの両方の原則に違反する追加機能を追加することに同意します。また、新しいレポートタイプがあるたびに、再び違反します。

私はgenerate_report()関数を保持しますが、generate()関数を持つInterface Type "ReportType"からパラメータを追加します。

これは、例えばあなたが(私のJavaの恩赦)を呼び出すことができますことを意味します

employee.generate_report(new CSVReport()) 

employee.generate_report(new HTMLReport()) 

そして明日あなたはあなただけのレポートインターフェイスからXMLReportを実装し、呼び出すXMLレポートを追加したい場合:

employee.generate_report(new XMLReport()) 

これにより、多くの柔軟性が得られ、新しいレポートタイプの従業員を変更する必要がなく簡単にテストできます(たとえば、generate_reportに複雑なロジックがある場合、Reportインターフェイスを実装するTestReportクラスを作成しての出力ストリームデバッグと呼び出しgenerate_report(new TestReport()))

関連する問題