2011-11-23 14 views
6

私はいつも他人を知るべきだと混乱します。他人について誰が知っておくべきですか?

例えば:

Circle.Draw(&canvas)又はCanvas.Draw(&circle)

又はDraw(&canvas, &circle)

EmployeeVector.Save(&file)又はFile.Save(&employee_vector)

あるいは静止

void operator() (Employee e) { Save(e.Serialize();} 
    for_each(employees.begin(), employees.end(),File) 

私はすべての種類のアダプタを持っているので、誰も知っていることがないように、あまりにも多く抽象化してしまうと思います。

答えて

8

誰が専門知識を持っているかによって異なります。

あなたが描くことができるのはサークルだけであれば、もちろんそれをCanvasに入れてあなたのところにいることができます。 Canvasにgeneric Shapeを描画するメソッドがある場合は、Shapeのさまざまなサブクラスに描画され、描画されます。例えば、円はキャンバス上に自分自身を描く方法を確実に知っています。私はキャンバスがネイティブに円を描く方法を知っているかどうかは疑問ですが、機能をハードコードしない限り、多様性の全体的な考え方を殺しません。

同じ理由から、ベクターはおそらく自分自身をファイルに保存する方法を知っているでしょうが、ベクトルで何をすべきかをファイルが知っているかどうかは疑問です。しかし、ベクトルにはさまざまなものが含まれている可能性があるので、ほとんどの作業を実際の要素に委譲する必要があります。だから、for_eachのアイデアがおそらく最高です。

+0

キャンバスを変更するとどうなりますか?単にキャンバスコードではなくサークルコードを変更する必要があります。 –

+0

は、キャンバスの抽象化で作業するかどうかによって異なります –

+0

@Joeとにかくコードを変更する必要があります。キャンバスを変更した場合は、 'Canvas'のメソッド群を変更するか、各シェイプクラスのメソッドを変更する必要があります。いずれにしても、 'Circle'クラスのサークルに関連するコードを変更する方が、' Canvas'クラスで行うよりも意味があります。また、なぜキャンバスが変わるのでしょうか?そのインターフェイスはおそらく、発信者を壊すのを避けるために変更を維持する必要があります。 –

2

ほとんどのデザインの質問と同様に、答えは、それは依存しています。 :-)

自分自身を描く方法を知っていることは意味がありますか?おそらく。同じことに、他の何かがそれを描く方法を知っていることも同様です。オブジェクトがグラフィカルエンティティの場合は、おそらくそれ自体を描画する方法を知っている必要があります。

節約のようなものについては、もう一度それは依存しています...ストリームのような抽象化に自分自身を直列化する方法を知ることは良いこともありますが、時にはエンティティをそのような単純なものに結合しない方が良いでしょうシリアライゼーションのような問題....

0

作成しているクラスの場合、通常は自分自身が関与するようにします。 CircleCanvasに描画されますので、Rectangleとなります。そうすれば、それらがすべてShapeのサブクラスであれば、彼らはShapeインターフェースを通して自分自身を描くことができます。これは保存にも同じです。これは拡張性があり、Canvasクラスを設計するときに可能なすべての形状を推測する必要はありません。

私にとっては、それは通常、あるライブラリによって既に定義されたクラスのユーティリティメソッドを含んでいます。たとえば、map、set、vectorなどのような一般的に使用されるSTLデータ構造を保存/ロードします。ユーティリティークラスstaticを使用してFileユーティリティークラスを介して実行されます。

関連する問題