どちらの方法がより適切なアプローチを決定しますか?DoSomethingToThing(Thing n)対Thing.DoSomething()
答えて
私は両方とも彼らの場所があると思います。
単に「機能プログラミングは良い」と思っているだけで、DoSomethingToThing(Thing n)
を使用しないでください。同様に、「オブジェクト指向プログラミングが良い」ため、単にThing.DoSomething()
を使用するべきではありません。
私はあなたが伝えようとしているものになると思います。あなたのコードを一連の指示として考えることをやめ、それについて話の段落や文のように考え始める。手元にあるタスクの観点から、どの部分が最も重要かを考えてください。例えば
あなたが強調したい「文」の一部が対象であれば、あなたはオブジェクト指向のスタイルを使用する必要があります。
例:
fileHandle.close();
あなたはファイルハンドル周りを渡しているとき、あなたが考えている主なものは、それが表すファイルのトラックを保っている時間のほとんど。
反例:HTTPリクエストを提出する。この場合
string x = "Hello World";
submitHttpRequest(x);
はそうsubmitHttpRequst(x)
x.submitViaHttp()
言うまでもなくに好適である、体の文字列よりもはるかに重要であり、これらは相互ではありません排他的です。おそらく実際には
networkConnection.submitHttpRequest(x)
のいずれかを混在させることになります。重要なことは、あなたが部分が強調されているものを考えるということです、そしてあなたがコードの将来の読者に伝えることになります。
ここで十分な情報はありません。それはあなたの言語が "Thing.something"またはそれと同等の構文(つまり、OO言語)をサポートしているかどうかによって異なります。もしそうなら、これはOOのパラダイムであるため(メンバーは、彼らが行動するオブジェクトに関連付けられるべきである)、はるかに適切です。手続き型のスタイルではDoSomethingtoThing()が唯一の選択です...またはThingDoSomething()
オブジェクト指向にするには、質問しないでください:http://www.pragmaticprogrammer.com/articles/tell-dont-ask。
したがって、DoSomethingToThing(Thing n)ではなくThing.DoSomething()です。
「私には尋ねないでください」それ!! Niiice !! – Mostlyharmless
それは固執しているように見えるそれらの些細な小さな言葉の一つです: – benefactual
優秀な記事 –
DoSomethingToThing(Thing n)は機能的なアプローチになりますが、Thing.DoSomething()はオブジェクト指向のアプローチになります。手続き型プログラミングの選択:)
対オブジェクト指向である
私は十分に文書オブジェクト指向の利点はThing.DoSomething()
あなたが事の内部状態を扱っている場合に適用されると思いますが、 Thing.DoSomething()は意味があります。なぜなら、Thingの内部表現を変更したり、それがどのように動作しても、それと対話するコードは変更する必要がないからです。あなたが物事のコレクションを扱ったり、いくつかのユーティリティメソッドを書いているのであれば、手続き型のDoSomethingToThing()はより意味をなさないかもしれません。それでも、通常はそのコレクションを表すオブジェクトのメソッドのように表すことができる。
Cart.getTotal();
対インスタンスの
GetTotalPriceofThings();
それは本当にあなたのコードオブジェクト指向がある方法によって異なります。
を頼まれましたが、考慮すべき要因のカップルです:
- あなたは
Thing
クラスを変更したり、拡張することができます。そうでない場合は、 Thing
をインスタンス化することができます。そうでない場合は、後で静的メソッドとして使用してください。Thing
が実際に変更される(つまり変更されるプロパティを持つ)場合は、後者を優先します。Thing
が変更されていない場合、後者は同様に許容されます。- それ以外の場合、オブジェクトは実世界オブジェクトにマッピングされるため、実際にはより根本的に思われる方法を選択します。
あなたがOO言語で作業していない場合でも、あなたはどこにいるでしょうか。あなたのコードの全体的な読みやすさのためのdoSomething()、のような関数のセットを持つ:
ThingDoSomething() ThingDoAnotherTask() ThingWeDoSomethingElse()
その後、
AnotherThingDoSomething()
などがはるかに優れています。
"Thing"で動作するすべてのコードは1か所にあります。もちろん、 "DoSomething"やその他のタスクには一貫して名前を付ける必要があります。つまり、ThingOneRead()、ThingTwoRead()などがあります。 12ヶ月の時間でコードの作業に戻ると、物事を論理的にする時間を取ることに感謝します。
一般に、「何か」が「物」が自然に行う方法を知っているアクションである場合は、thing.doSomething()を使用する必要があります。そうでなければDoSomethingToThing(物)は "物"の潜在的な内部情報にアクセスしなければならないので、それは良いOOカプセル化です。たとえばinvoice.getTotal(のために
)
「何か」は自然に「事の」ドメインモデルの一部でない場合には、一つの選択肢は、ヘルパーメソッドを使用することです。例えば
:Logger.log(請求書)
オブジェクトへのDoingSomethingが別のシナリオでは異なる結果を生成する可能性がある場合、私はoneThing.DoSomethingToThingあなたにお勧めしたい(anotherThing)。
例えば、2つのプログラムを保存していて、DatabaseObject.Save(物)SessionObject.Save(物)を採用するとthing.Save()やthing.SaveToDatabase .SaveToSession()。
パブリックプロパティを取得していない限り、クラスにパラメータを渡すことはめったにありません。
イオンの答えに追加するには、物事とあなたが何をしたいかによって異なります。あなたがThingを書いていて、DoSomethingがThingの内部状態を変えるなら、最良のアプローチはThing.DoSomethingです。しかし、アクションが内部状態を変更する以上のことをした場合、DoSomething(Thing)は意味があります。たとえば:
Collection.Add(Thing)
よりも良い
Thing.AddSelfToCollection(Collection)
であり、あなたが事を書いていない、と派生クラスを作成することができないならば、あなたは何をするしかし、誰chocieを持っていないのdoSomething(シング)
- Thing.DoSomethingは、あなたの文章の対象であれば適切です。
- Thingが文の対象である場合、DoSomethingToThing(Thing n)が適切です。
- 私が考えることのできるすべての言語で、関数は1つのクラスに属し、相互に所有されていないため、ThingA.DoSomethingToThingB(ThingB m)は避けられない組み合わせです。しかし、これは理に適っています。なぜなら、あなたは被写体と被写体を持つことができるからです。
能動態は受動態よりも簡単ですので、あなたの文章は、単に「コンピュータ」ではない主題を持っていることを確認してください。つまり、フォーム1とフォーム3を頻繁に使用し、フォーム2はまれに使用します。明確にするために
:
// Form 1: "File handle, close."
fileHandle.close();
// Form 2: "(Computer,) close the file handle."
close(fileHandle);
// Form 3: "File handle, write the contents of another file handle."
fileHandle.writeContentsOf(anotherFileHandle);
でもオブジェクト指向プログラミングではなく、メソッドの関数呼び出しを使用することが有用である(あるいは、我々はそれを呼び出す以外のオブジェクトのメソッドを呼び出すそのことについてかもしれませんに)。あなただけのオブジェクトに()を呼び出す保存したいのですが、簡単なデータベースの永続化フレームワークを想像してみてください。代わりに、すべてのクラスでのSQLステートメントを含むのあなたは、このようにすべてのコード間でSQLを広げ、コードを複雑にし、ストレージエンジンPITAを変更すること、保存しているしたいのですが、あなたは(クラス2を、(クラス1)の保存を定義インターフェイスを作成救うことができます)等とその実装。次に、実際にdatabaseSaver.save(class1)を呼び出して、すべてを1か所にまとめています。
私も心の中で2つの形態のいずれかの呼び出し元を保つKevin Conner
に同意する必要があります。呼び出し側は、おそらく間違いなくあなたのもの:)私はオリオンに同意
に何かをするいくつかの他のオブジェクトのメソッドですが、私は意思決定プロセスを修正してくださいするつもりです。
あなたには名詞と動詞/オブジェクトとアクションがあります。
- このタイプのオブジェクトの多くがこのアクションを使用する場合は、オブジェクトのアクション部分を作成してみてください。
- それ以外の場合は、アクションを個別にグループ化しますが、関連するアクションを使用してください。
私はFile/stringの例が好きです。 "SendAsHTTPReply"のような多くの文字列操作がありますが、これは平均文字列では発生しませんが、特定の設定で頻繁に発生します。しかし、基本的には常にFile(うまくいけば)を閉じるので、Closeアクションをクラスインタフェースに置くのが理にかなっています。
これを考えるもう1つの方法は、エンターテインメントシステムの一部を購入することです。 TVリモコンをテレビと一緒にバンドルするのは意味があります。なぜなら、あなたは常にそれらを一緒に使うからです。しかし、多くの顧客がこれを決して使用しないので、特定のVCR用の電源ケーブルをテレビにバンドルすることは奇妙です。重要なアイデアはこのオブジェクトでこのアクションをどのくらいの頻度で使用するのですか?
重複しているhttp://stackoverflow.com/questions/68617/design-question-does-the-phone-dial-the-phonenumber-or-does-the-phonenumber-dia – UnkwnTech