2012-01-27 4 views
2

私はいくつかの質問があります。 まず最初に、以下のコードはDemeterの法律に違反していますか?マップタイプがマップとのkeySet(ですのでデメターとハッシュマップの法則

Map map = new HashMap<String, String>(); 
map.put("foo","bar"); 
map.put("fooo","baaar"); 
map.keySet().iterator() 

IMO上記のコードは、デメテルの法則に違反する)Setオブジェクトを返します。どちらも違います。私は "キー"だけを保持する2番目のプロパティについて考えていますが、この正しい解決策ですか?

答えて

1

はい、技術的には、方法の観点から説明するとDemeterの法則に違反しています。しかし、ここではのように "keysIterator"のような操作をMapクラスに追加することになりますが、それ以外は妥当なアクションかもしれません。マップはコードではありません。

目的の法律のは、アプリケーションのコンポーネント間の結合を減らすことです。標準ライブラリオブジェクトの使い方を変更しても、それは影響を受けません。あなたの提案されたソリューションは、無駄なリソースであり、特別なメリットはありません。

マップのkeySetは、マップの単なるファセットです。マップが提供する操作を分類する方法として、3番目のオブジェクト(LoDは本質的に相互作用に2つ以上のオブジェクトを持つべきではないと主張する)と考えるべきではありません。


異なるシナリオを想像してみて:あなたは、オンラインストアでのカテゴリ、たとえば、同じようアプリケーションクラスがあるとします。それは有意義のLoD違反が

category.itemsSet().iterator() 

を持っているだろうし、これはあなたがリファクタリングする場合がありますものです。どうして?実際に必要とされる唯一の操作が、必要な作業しか実行できず、実行可能な実装を持つのではなく、反復(または一般に、Setインタフェースよりも少ない操作)であっても、Categoryクラスを制約してSetを実装するためです。より簡単に改訂または再実装。

一方、カテゴリに行う操作がすべての操作をカバーしている場合は、Category.itemsSet()ファセットを提供するのは愚かです。


注:別のオブジェクトと1の関係と本質的に「同じもの」、特に狭い視野の異なる図である:「ファセット」ここでは1である物体を意味します。これは完全に標準的な用語ではありません。

+0

と記載されている。また、法律としての "法律"を見るべきではありませんが、それは理にかなったときに壊れるかもしれない提案やガイドラインです(Kevinがここに示したように)。 – Dan