1. 序章

優れたオブジェクト指向ソフトウェアを作成することは簡単な作業ではありません。 私たちにとって幸いなことに、私たちが最初にそれを行ったわけではありません。私たちの前にたくさんのプログラマーが、堅牢で読みやすいオブジェクト指向コードを作成するために信頼できるいくつかの原則と手法を構築しました。

それらの原則の中には、SOLIDの原則があります。

この短いチュートリアルでは、これらの原則の1つであるリスコフの置換原則に焦点を当てます。

2. リスコフの原則の定義

では、リスコフの置換原則とは何ですか? 紹介したように、はSOLIDの原則の一部であり、優れたオブジェクト指向ソフトウェアを作成するために従うべき一連のルールです。 まず、それらについて少し話し、次にリスコフの置換原則に移ります。

2.1. SOLIDの原則

これらは、によって説明および促進されるいくつかの原則ですロバートC。 マーティン 、またはソフトウェア開発の世界で有名な俳優のボブおじさん:

  • S単一責任の原則
  • Oペン-閉じた原理
  • Liskov置換の原則
  • Iインターフェイス分離の原則
  • D依存性逆転の原則

これらの原則に従うことで、より読みやすく、保守と進化が容易なソフトウェアの作成につながるはずです。

2.2. リスコフの置換原則

もちろん、その中にはリスコフの置換原則があります。 「サブクラスes は基本クラスの代わりに使用できる必要があります」と記載されています。つまり、特定のクラスが使用されることを期待するコードは、このいずれかが渡された場合に機能するはずです。クラスのサブクラス。

いくつかのCarおよびTruckクラスによって拡張されたVehicleクラスを想像してみましょう。

次に、あらゆる種類の車両を修理するGarageクラスがあるとします。

補償の行為は、 Vehicle引数を取るGarage#repairメソッドによって実装されます。 つまり、このメソッドにCarまたはTruckのどちらを指定しても、リスコフの置換原則を尊重するために機能する必要があります。

これで、 Vehicle を受け入れるクラスを設計することを完全に想像できますが、非準拠のVehicleが渡されると何らかのエラーがスローされます。 たとえば、 CarDriverクラスとdrive()メソッドがあり、このメソッドは Vehicle 引数を取りますが、車のドライバーはトラックを運転しません。 :

次に、そのようなクラスのクライアントとして、任意の種類の Vehicle をdriveメソッドに渡すことができると期待しますが、Truckを渡すと失敗します。 これは、リスコフの置換原則を尊重しないクラスの例です。

これには結果があります。これについては次のセクションで説明します。しかし、最初に、ここで原則をどのように実施できたかを見てみましょう。

明らかに、車の運転手はトラックを運転するべきではありません。 したがって、CarDriverVehicleの関係を置く代わりに、特定のクラスレベルCarDriverと[ X176X]車:

3. 原則を破った結果

リスコフの置換原則を破った場合の結果はどうなるでしょうか?

3.1. 誤解を招くコード

まず第一に、これは誤解を招くコードに私たちをもたらすでしょう。 事実上、何らかの動作が機能することを期待する必要がありますが、機能しません。運が良ければ、これは文書化されており、コードを適応させるのに十分早い段階で文書を読みます。 そうでない場合は、コードの実行時にその知識を取得します…そして失敗します! それは次の2つの結果につながります。

3.2. 読みにくいコード

幸運にも、使用したい機能の一部がすべてのサブクラスで機能しないことを知ったとしましょう。 だから、私たちはそれに対処する必要があります。 最良のシナリオでは、適合しないサブクラスの使用を回避できます。 ただし、最悪の場合、これらのクラスを処理する方法を見つける必要があります。

例を挙げて、クラスの所有者ではなく、クラスを変更できないとしましょう。次に、CarTruckのコードパスを分離するための条件付きロジックを追加する必要があります。 流動的な一連の指示があったところで、現在、複数の可能なブランチがあり、サブクラスを管理することを余儀なくされています。 それを避けるためのクラス階層の目標の1つではありませんか?

3.3. エラーが発生しやすいコード

さて、それに直面しましょう、私たちはいつもそれほど幸運ではありません。 場合によっては、受け継いだサブクラスに関係なく機能すると考えて、単純にコードを使用すると、コードが機能するはずの場所で失敗することがあります。 テスト段階でそれがわかるかもしれません。 と同様に、本番環境で使用するまでは表示されない可能性があり、これはより大きな問題です。

4. 結論

この記事では、SOLIDの原則の1つであるリスコフの置換原則について学びました。 その目的が何であるか、そしてその原則を破ることがコードにどのように影響するかを見ました。