したがって、あなたは単責任原則のために自分自身を教育しようとすると、「のような定義に遭遇する可能性が高い」というメッセージが表示されます。 "1クラスはを変更する理由の1つに過ぎません。"そして、そここの実際のコードで単一責任の原則を理解する
class Dog {
String bark() {
return "Woof";
}
}
のようなおもちゃの例の束が常にあるしかし、私は、それは非常に難しいエンタープライズアプリケーションの開発にこの原則を適用するために見つけます。
"プロジェクト要素"、 "アクティビティ"、 "従業員"があるアプリケーションがあります。従業員には多くのアクティビティがあり、アクティビティには1つのプロジェクト要素があります。
一部の従業員はすべてのプロジェクト要素に割り当てられていますが、一部のプロジェクト要素には割り当てられているものもあります。プロジェクト要素をEmployeeから削除し、新しい要素を割り当てることができます。従業員は、自分に割り当てられたプロジェクト要素を持つ新しいアクティビティのみを追加できます。プロジェクト要素が割り当てられていない場合、これはすべてが利用可能であることを意味します。
私たちのクライアントには、新しいアクティビティを追加するときにお気に入りのプロジェクト要素の一覧が表示されることが必要でした。従業員がプロジェクト要素をどのようにお気に入りにするかは関係ありません。異なるビューです。
お気に入りのプロジェクト要素は、いくつかの興味深い規則で並べ替える必要があります。 これは、Favorite Project Elementが存在するアクティビティの合計計算作業に依存し、最後の60日間のみが考慮されます。少なくともそれは、具体的な要件です。..
だから、それはこれを実装するために私の義務だった、とここで私が持っている実装です:
public List<ProjectElement> getFavoriteProjectElementsSortedDescendingByTotalWorkHoursInLast60Days(Employee owner) {
// All Favorite Project Elements of Owner
final List<ProjectElement> favoriteProjectElementsOfOwner
= (List<ProjectElement>) (List<?>) favoriteBusinessObjectHelper.getAllFavoriteObjectsForBusinessObjectType(BusinessObjectType.PROJECT_ELEMENT.toInt());
// Activities by Favorite Project Elements
final List<Activity> favoriteProjectElementActivitiesForLast60Days
= activityFinder.findByInProjectElementsForLastGivenDates(owner, favoriteProjectElementsOfOwner, 60);
// Create a Map with Favorite Project Element - Calculated Work
final Map<ProjectElement, Long> projectElementTotalWorkMap = new HashMap<ProjectElement, Long>();
for (Activity activity : favoriteProjectElementActivitiesForLast60Days) {
final ProjectElement activityProjectElement = activity.getProjectElement();
if (!projectElementTotalWorkMap.containsKey(activityProjectElement)) {
projectElementTotalWorkMap.put(activityProjectElement, 0L);
}
final long calculatedWork = activity.getCalculatedWork();
final long totalCalculatedWork = projectElementTotalWorkMap.get(activityProjectElement) + calculatedWork;
projectElementTotalWorkMap.put(activityProjectElement, totalCalculatedWork);
}
// Sort the Map by value descending
final Map<ProjectElement, Long> sortedProjectElementTotalWorkMap
= InnboundSortTool.sortByValueDescending(projectElementTotalWorkMap);
// We do not want to show owners Favorite Project Element in the sidebar, if the Project Element is not available
// for Employee anymore.. See the comments at the end of the file.
final Set<ProjectElement> allowedProjectElementsForOwner = owner.getExplicitlyAssignedOnlyActiveProjectElements();
final ArrayList<ProjectElement> projectElementsSorted = new ArrayList<ProjectElement>();
for (ProjectElement projectElement : sortedProjectElementTotalWorkMap.keySet()) {
if (allowedProjectElementsForOwner.size() == 0) { // This means Employee does not have any restrictions, all Project Elements are available to him.
projectElementsSorted.add(projectElement);
} else { // If Employee has assigned Project Elements, we must check if the Favorite Project Element is assigned to him..
if (allowedProjectElementsForOwner.contains(projectElement)) {
projectElementsSorted.add(projectElement); // If yes, add it to list, if no simply continue the loop without adding.
}
}
if (projectElementsSorted.size() == 20) {
break; // 20 is an arbitrary value, we do not want to show too many Favorite Project Elements in the UI.. Limit by 20.
}
}
return projectElementsSorted;
}
おっと、それは一つの大きな方法ですが、それは仕事を取得します完了しました。しかし、それは一つのことをしませんか?しかし、すべての方法が1つのことだけを行う場合、誰がそのすべてをやろうとしていますか?
私はヘルパークラスを導入し、そのクラスにすべてを委任し、呼び出しを開始ください:
final Map<ProjectElement, Long> projectElementTotalWorkMap = helper.CreateprojectElementTotalWorkMap();
helper.removeUnassignedFavoriteProjectElementsFromEmployee();
など?しかし、ヘルパー自体にヘルパーを導入するのですか?それはどこで終了しますか?私はこのようなリファクタリングを開始すると、私は他のメソッドを呼び出す非常に役に立たない方法を、持ってしまうと、このクラスは次のようになります。
List<ProjectElement> favoritesList;
favoritesList = helper.doThis();
favoritesList = helper.doThat();
favoritesList = helper.sort();
return favoritesList;
私はすべてこの原則を理解しないのですか?私はそうではないと思うので、ここに質問があります。このメソッドを "SRP"に従うように修正する方法はありますか?
はい、間違いなく、ありがとうございました。しかし、まだ、5行のコードをプライベートメソッドに移動するだけですか?おそらく私はそれに付随する概念(または優位性)を理解することができない人です。 –
@KorayTugayあなたはそれが無意味で余分な仕事のように見えることは間違いありません。しかし、私のチームのメンバーがコードを理解する必要があるときに、私のためのこの力が出てきます。大きな画像を理解する必要がある場合、これらの「オーケストレーション」機能を見ることができます。物事がうまくいかないときにだけ、彼らはもっと深く進む必要があり、うまくいけば彼らはどこを見なければならないのか理解できるようになります。それはまた、大きな機能を見るために非常に威圧的で認知的な過負荷です。良い読み物は、ロバートマーティンのクリーンコードです。 – Reasurria