33

クラスがメソッドにどのように関係しているかを理解するのに苦労しています。メソッドはオブジェクト行うものですか、それともオブジェクトに対して行われるものですか? それとも、これはまったく別の概念ですか?

具体的には、図書館のソフトウェア システムでは、borrow()メソッドは図書館の利用者を表すクラスに属すべきか、それとも利用者が借りているアイテムを表すクラスに属すべきか? 私の直感では、patron.borrow(copy)英語の文の構造のように、subject.verb(object);のように読む必要があります。しかし、私のインストラクターはそれは間違っていると言い、なぜ彼がクラスborrow()に所属していたのか理解できCopyません (そして、彼は物事をあまりうまく説明していません)。私は正当化を求めているわけではありませんが、誰かが適切な関係を説明できますか?

編集:この質問は「トピック外」としてクローズされました。理解できない。ソフトウェア設計に関する質問は、このサイトには適していませんか?

4

11 に答える 11

12

主観的:)しかし、正直なところ、私はInformation Expertパターンを使用して、次のようなことを言います

library.lend(item, patron)

ライブラリには、(おそらくそのカタログにある) アイテムに関する情報が含まれています。
図書館はアイテムを利用者に貸与します(登録しているため、利用者はそれを認識しています)

インストラクターがこれをどのように見ているかはわかりませんが、これはシナリオにとって意味のある「抽象化」(現実世界のエンティティを模倣するソフトウェア オブジェクト) のレベルです。

于 2012-04-26T05:56:07.290 に答える
10

OOP の概念を、Java や C++ などの特定の具体化と混同しないでください。

この制限「メソッドはオブジェクトのプロパティです」はOOPのアイデアの一部ではなく、一部の実装の一部であり、発見したようにうまくスケーリングしません。

「整数」オブジェクトにはいくつのメソッドが必要ですか? より論理的なものは何ですか...myfile.write(myint)またはmyint.write(myfile)? これに対する良い一般的な答えは実際にはありません。メソッドが単一のオブジェクトの一部であるという考えは特殊なケースであり、問​​題をこのソリューションに適合させるために必要な曲げが目立つようになるか、ショーストッパーに近づくことさえあります。メソッドが処理されるオブジェクト以外のパラメーターを持たない場合にのみ、答えは本当に完全に受け入れられます。単一のタイプが含まれる場合にのみ、単一のディスパッチが完全な答えです。

他の言語では、オブジェクトとメソッドが分離されているため、たとえば、ファイル オブジェクト、整数オブジェクト、およびwrite(myfile, myint)操作が必要なときに何をすべきかを説明するメソッドがあります...そして、このメソッドはファイルの一部でもなく、整数の。

于 2012-04-26T05:59:59.890 に答える
7

最初にいくつかの一般的な単語。

ソフトウェアの構築は、英語のルールや「美しさ」などに支配されるべきものではなく、エンジニアリングの分野です。あなたの設計が問題を解決するかどうか、保守可能かどうか、テスト可能かどうか、開発の並列化が可能かどうかなどを考えてください。より形式化されたものが必要な場合は、DL Parnas による「システムをモジュールに分解する際に使用される基準について」をご覧ください。

ライブラリの例については。ライブラリの外にコピーがあると想像してください。その場合、borrowメソッドが必要ですか? 借入はどのように登録されますか?データストレージを担当する Copy または Patron クラスのいずれかで問題ありませんか? borrowLibrary クラスに入れる方が適切に見えます。責任は明確に分割されます。Copy と Patron を実装するために借用について多くを知る必要はなく、Library を実装するためにそれらについて多くの詳細を必要としません。

于 2012-04-26T07:35:10.243 に答える
3

クラスから公開されるパブリック メソッドは、エンティティに対して実行できるタスクです。そうすれば、クラスはその動作をカプセル化するだけになります。

例:私が言うなら

Computer.TurnOn()

この方法は、コンピューター システムでのみ機能します。

代わりに、

SomeOne.TurnonComputer()

誰かがコンピューターの電源を入れる (コンピューターの関連するプロパティを設定する) 責任を持つようになります。つまり、カプセル化の概念を満たしていないことを意味し、クラスのプロパティをあちこちに分散させます。

于 2012-04-26T06:17:17.587 に答える
3

OOP のポイントは、各実装で、特定の不変条件に従う定義済みのデータ セットを処理する多相関数を作成することです。

したがって、オブジェクトを変更するメソッドは、そのオブジェクトのクラスで定義する必要があります。純粋に機能的なコードがどこに存在するかは問題ではありませんが、入力の型 (単一の入力を受け取る場合) または出力に存在するはずです。

あなたの例では、 のborrowデータを変更する場合copy、そこに存在する必要があります。ただし、特定のコレクション (利用者または図書館のコレクション) に保持されている本の貸出ステータスをモデル化する場合はborrow、所有者クラスを設定する方が理にかなっています。ただし、後者の設計では、コピーが複数のコレクションに含まれる可能性があるため、コピーにもいくつかの情報 (および対応するメソッド) を配置する必要があります。

于 2012-04-26T07:44:18.563 に答える
3

@Ryan Fernandesが言ったように、貸出/借用操作は、常連客または本ではできません。図書館のすべての本と利用者の状況を知っているクラスと一緒でなければなりません。たとえば、本に対する保留中の予約はありますか? 利用可能なコピーの数は? このパトロンはすべての料金を支払いましたか?彼はこの本を読む資格がありますか? したがって、通常、これは Library または LibraryService クラスにある必要があります。

于 2012-04-26T06:03:02.827 に答える
1

メソッドはオブジェクトが行うものですか、それともオブジェクトに対して行われるものですか? それとも、これはまったく別の概念ですか?

まず、クラスとオブジェクトについて明確にさせてください。Class通常、特定のカテゴリを示すために使用されます。お気に入り

  1. フェラーリでもポルシェでもない
  2. バナナでもリンゴでもない果物

つまり、運転するのはフェラーリであり、食べるのはバナナです。彼らのクラスではありません

常にプロパティと動作を持つオブジェクトです。

具体的にあなたのケースに行くことさえ。

borrow()メソッドは、レコードがそれ自体の別のオブジェクトによって保持されてpersonいるオブジェクトに対して、のオブジェクトによって実行されるアクション/動作です。booklibrary system

私にとってこれをOOの方法で表現する良い方法は次のようになります

libray.borrow(new book('book title'), new person('starx'));

楽しみのために、これについてどう思いますか

person starx = new person('starx');
book title1 = new book('title1');
library libraryname = new library('libraryname');
libraryname.addBook(title1);

if(starx.request(title1, libraryname)) {
     starx.take(library.lend(title1, starx));
}
于 2012-04-26T06:12:16.370 に答える
1

正確な理由についてはよくわかりませんが、次のように考えることができます。複数の患者が医者を訪ねる場合、次の患者をいつ呼ぶべきかを知っているのは医者だけなので、次の方法は医者の責任の一部になります。 、患者は次に行かなければならないので、次は患者の責任の一部であるべきだと考えたくなりますが、いつか図書館の本が発行されるとき、それは本(リソース)がいつそれを知っているかのように、常連客ではなく本のジャンルの責任であるべきです。無料になります。

于 2012-04-26T05:53:25.183 に答える
0

今日はまさにそんなことを考えていました。私はこの結論に達しました:

適切なコンテキストでは、どちらがより理にかなっています。

于 2012-04-26T08:04:46.963 に答える
0

あなたのインストラクターの権利。ええと、実際には、彼は間違っています。知らない。

私が言いたいのは、このような質問に対しては、何らかの形で確固たる一般的な答えがないことが多いということです. それは主に、特定のケースで何が最適に機能するかにかかっています。最も簡単にコーディングできるものを使用してください。それが最も維持しやすいものです。そして、「コード化が最も簡単」ということで、クラスの意図したユーザーも考慮に入れることをお勧めします(Library、 、CopyおよびPersonクラスだけではありません)。

于 2012-04-26T06:04:50.110 に答える
0

どちらでもいけそうです。厳格なルールはありません。アイデアは、グループが論理的に機能することであり、理にかなっています。私には、Patron#borrow(BookCopy)と同じ意味になりBookCopy#borrow(Patron)ます。または、クラスがあるかもしれませんLibManager.borrow(BookCopy, Patron)

于 2012-04-26T06:03:01.450 に答える