プロのプログラマーは、OOPに行くかどうかをどのように判断するのですか?それは私にとって本当に役立つでしょう。
私にとって、2つの決定ポイントがあります。最初に、最初は明らかな場合があります。実装の詳細が大きく異なる共通のメソッドをすべて共有する同様のタイプが多数あります。たとえば、ワークフローシステムを構築していて、任意のタスクを実装する機能が必要でした。タスクを実行するために、Execute()
抽象メソッドを使用して、各タスクが継承する基本クラスを実装しました。継承クラスは実装を提供しましたが、ワークフローシステムは、実行されているタスクの種類について何も知らずに実行を開始できました。
しかし、ほとんどのプロジェクトはそれほど明確ではありません。2番目の決定ポイントは、プロジェクトのサブセットがif-thenステートメントまたはswitch-caseステートメントの巨大な絡み合いに成長したとき、特にそれらのif-thenステートメントが正しく実行するために多くのセットアップコードを必要とするときです。私は自分が達成しようとしていることの論理を失い始めているように感じ、コードは脆弱に感じ始めます。その時点で、通常は特定の実装を使用してコードを基本クラスにリファクタリングするときが来たという兆候です。
機能的なスタイルではなくオブジェクト指向のスタイルに切り替えることの大きな部分は、if-thenステートメントを「このアクションを実行する」ステートメントに変換することです。if-thenステートメントの膨大なセットの代わりに、コードにアクションを実行するよう指示するだけです。実際に実行されるアクションは、指定した実装によって異なります。
たとえば、C#スタイルの擬似コードの機能スタイルは次のとおりです。
if ( action == "email" ) {
callEmailFunction(userInfo);
}
else if ( action == "sms" ) {
callSmsFunction(userInfo);
}
else if ( action == "web" ) {
endpoint = "http://127.0.0.1/confirm";
confirmWeb(endpoint, userinfo);
}
...
ただし、次のように書き換えることができます。
interface IConfirmable {
void Confirm(UserInfo userinfo);
}
public class ConfirmEmail : IConfirmable {
public void Confirm(UserInfo userinfo) {
// do the appropriate thing to confirm via email
}
}
public class ConfirmSms : IConfirmable {
public void Confirm(UserInfo userinfo) {
// do the appropriate thing to confirm via email
}
}
public class ConfirmWeb : IConfirmable {
// this is a constructor
public ConfirmWeb(string endpoint) {
...
}
public void Confirm(UserInfo userinfo) {
// do the appropriate thing to confirm via web
}
}
そして、コード自体:
// An implementation that decides which implementation of the base class to use
// This replaces the if-then statements in the functional programmming.
IConfirmable confirmer = ConfirmerFactory.GetConfirmer();
// get the userinfo however you get it,
// which would be the same way you get it in the functional example.
UserInfo userinfo = ...;
// perform the action.
confirmer.Confirm(userinfo);
さて、if-then内に非常に小さなコードがある場合、これは利益を得るための多くの作業のように見えます。そして、if-thenに非常に小さなコードがある場合、それは正しいです。それは、理解するのが難しいコードの多くの作業です。
しかし、オブジェクト指向スタイルは、Confirm()
実行する必要があるメソッドだけでなく、複数のアクションがある場合に本当に輝いています。初期化ルーチン、実行可能な3つ以上のアクションメソッド、およびメソッドがある場合がありますCleanup()
。基本アルゴリズムは同一ですが、共通の基本クラスを実装する適切なオブジェクトを呼び出します。さて、あなたは、オブジェクト指向のスタイルに真のメリットを見始める:基本アルゴリズムがあるくらい、それは方法のあらゆるステップでのif-then文をチェックしていた場合よりも読みやすいです。