2017-12-08 13 views
-2

私は小さなプロジェクトを構築しています。プロジェクトの設計方法についていくつかの情報を得たいと思います。自分の考え方が良いか悪いかが分かり、それが悪い場合はどうやって悪くなり、どのように改善することができますか? クラスデザイン - 私のアプローチは正しいですか?

  • エリアの建物の
  • 数:2つのプロパティがあり

    • ストリート、:

      は、私は3つのクラスがあります。

      • 地図<文字列を持っている
    • 市は、ストリート> - 文字列が
      • 地図<文字列を持っている
    • 国、StreetName
    • で、市は> - 文字列CityNameです。

私は2つの国のオブジェクトを比較し、レポートを作成したいです。 2つの都市(異なる国から)が同じStreetNameを持っている場合は、同じCityNameチェックを行います。同じStreetNameを持つ場合、建物の面積と数を比較します。彼らが同じStreetNameを持っていない場合、レポートには「都市名は同じですが、建物には20の建物があり、もう1つに55の建物があります」と書いてあります。 (同じ面積と建物数の場合は、報告書に何かを書く)。

これは私がそれを行うには考えていた方法です。

  • 3つのクラスを作成します。CountryReport、CityReportとStreetReport
    • CountryReportがCityReportのリストを持っていますし、cityCompareReportの方法を持っています(国、国)。メソッドcityCompareReportは2つの国を受け入れ、同じCityNameを持つ場合、CityReportのオブジェクトを作成し、それらの都市を比較します。
    • CityReportはStreetReportのリストを持ち、streetCompareReport(City、City)のメソッドを持ちます。 streetCompareReport()メソッドは2つの都市を受け入れ、同じStreetNameを持つ場合はStreetReportのオブジェクトを作成し、それらの街を比較します。
    • StreetReportは、建物の面積と数を比較し、適切なレポートを提供します。

私は(私は:)学びたい)うまくいかなかったところ私に教えてください、それはそれを行うには正しい方法だ場合は私に知らせてくださいそうでない場合。

+0

あなたのデザインが良いかどうかは、あなたのプロジェクトについてもっと知りません。たとえば、Javaでアルゴリズムを書く能力がテストされている学校の割り当てですか?どこからデータを取得していますか?実際のプロジェクトでは、おそらくすべてのデータをデータベースに保存し、クエリを使用して探しているデータを取得します。 – StriplingWarrior

答えて

3

まず、実世界のデータを処理する必要がある場合は、https://www.mjt.me.uk/posts/falsehoods-programmers-believe-about-addresses/を読んでから、熱心に考え始めることをお勧めします。

実際には、このようなことをクラスの混乱に抽象化しないように強くお勧めします。問題を何度も解決するまで、良い抽象を打つことはまずありません。だからあなたの考えをロックしないでください。

もちろんこれはおそらくクラス用です。あなたの先生が望んでいることをしてください。あなたの教師があなたがクラス定義を作り出すことができるのを見たいと思っているなら、多くのクラス定義を持ってください。実際には良いコーディングスタイルではないことをあなたの頭のどこかに気付かせてください。

つまり、他の人がこのような問題をどのように解決したかを見てみることをお勧めします。たとえば、https://developers.google.com/places/web-service/detailsは、Googleが思いついた現実世界のソリューションを示しています。 Googleが内部的に行っていることは、そのデータ構造をプロトコルバッファ(それについてはhttps://developers.google.com/protocol-buffers/を参照)として定義することです.JavaやXMLなどのシリアル化ロジックだけでなく、Javaを含む複数の言語のコードを自動的に生成します。

address_componentsの可能なコンポーネントごとに各クラスを呼び出すコードを記述するのではなく、コンポーネントをタイプごとに並べ替えて比較する単純なループを書くことができます。少ないコードが良い。繰り返される非常に似たコードが悪い。

1

通常、すべてのクラスにそれ自身を表現するのに必要なすべての属性を与えることをお勧めします。だから、ストリートには名前があり、エリアに属し、いくつかの建物があります。都市には通りがあります。 StreetsはStreetインスタンスのリストを表すオブジェクトであり、Streetにアクセスする方法に関する知識を含んでいます。内部的にはStreet.name()に簡単にアクセスできるようにマップを使用するかもしれませんが、実装方法は外部クラスの "ブラックボックス"です。 Cityインスタンスに関する知識を持つオブジェクトであるCitiesを含んでいるため、Countryにも同じことが言えます。 これで適切な場所で行動を起こすことができます。ある機能を担当するのは誰か自分に尋ねてください。

カントリー・コンパラブルとシティを独自の実装でも作成できます。そうすれば、あなたは自分が属する場所のすべての責任を負うことになります。

関連する問題