일부 오래된 코드를 업그레이드하는 동안이 두 가지 OO 원칙이 서로 충돌하는 상황을 발견했습니다.우선 순위 : 자신 또는 단일 책임 원칙을 반복하지 마십시오?
는 (그것이 내가 발견 한 내용의 단순화 된 버전이다) 다음의 의사를 고려
int numberOfNewRecords;
int numberOfOldRecords;
int numberOfUndefinedRecords;
void ColourAndCount()
{
foreach(Row row in dataGridView1.Rows)
{
switch(row.Cells["Status"])
{
case: "Old"
row.BackColor = Color.Red;
numberOfOldRecords++;
break;
case: "New"
row.BackColor = Color.Blue;
numberOfNewRecords++;
break;
default:
row.BackColor = Color.White;
numberOfUndefinedRecords++;
break;
}
}
}
이 코드는 두 가지 작업을 수행 : 그것은 집계 상태로 레코드의 수까지, 그리고 그것은 또한 각각 colourises 행으로, 다시 그들의 상태. 지저분하지만이 두 작업이 항상 동시에 호출 되었기 때문에 문제가 발생하지 않았으며 추가 상태와 같은 유지 관리 요구 사항을 쉽게 추가 할 수있었습니다.
(편집) 마이너 참고 :
그럼에도 불구하고, 원리 나에게 말한다 단일 책임은 내가 두 개의 별도의 방법으로이 분할해야 난 그냥 용어를 여기에 "단일 책임 원칙"을 오용 할 수있다 깨달았다있는 나는 그것이 수업을 말하는 것을 이해한다. "메소드 당 하나의 연산"디자인 패턴의 용어는 무엇입니까?
int numberOfNewRecords;
int numberOfOldRecords;
int numberOfUndefinedRecords;
void Count()
{
foreach(Row row in dataGridView1.Rows)
{
switch(row.Cells["Status"])
{
case: "Old"
numberOfOldRecords++;
break;
case: "New"
numberOfNewRecords++;
break;
default:
numberOfUndefinedRecords++;
break;
}
}
}
void Colour()
{
foreach(Row row in dataGridView1.Rows)
{
switch(row.Cells["Status"])
{
case: "Old"
row.BackColor = Color.Red;
break;
case: "New"
row.BackColor = Color.Blue;
break;
default:
row.BackColor = Color.White;
break;
}
}
}
하지만이 자신을 반복하지 마십시오 위반 : 루프와 스위치 문이 두 방법에 복제하고,이 코드에 대한 가장 가능성있는 업그레이드 경로부터 다른 상태 중 추가입니다, 그것은 향후 업그레이드가 더 어려워 보다 적게보다는 오히려.
리팩터링하는 가장 우아한 방법을 찾는 데 어려움을 겪었으므로 놓친 부분이있는 경우 커뮤니티에 물어 보는 것이 가장 좋습니다. 이 상황을 어떻게 처리하겠습니까?
(EDIT)
나는 하나 개의 가능한 솔루션을 함께했다하지만, 간단한 문제 엔지니어링을 통해-의 예처럼 내게 보이는 (그리고 정말 원래 하나의 책임 문제가 해결되지 않습니다).
struct Status
{
public string Name,
public int Count,
public Color Colour,
}
Dictionary<string, Status> StatiiDictionary = new Dictionary<string, int>();
void Initialise()
{
StatiiDictionary.Add(new Status("New", 0, Color.Red));
StatiiDictionary.Add(new Status("Old", 0, Color.Blue));
StatiiDictionary.Add(new Status("Undefined", 0, Color.White));
}
void ColourAndCountAllRows()
{
foreach(Row row in dataGridView1.Rows)
{
CountRow(row, StatiiDictionary);
ColourRow(row, StatiiDictionary);
}
}
void CountRow(Row row, Dictionary<string, Status> StatiiDictionary)
{
StatiiDictionary[row.Cells["Status"]].Count++;
}
void ColourRow(Row row, Dictionary<string, Status> StatiiDictionary)
{
row.BackColour = StatiiDictionary[row.Cells["Status"]].Colour;
}
원래 코드와 비슷한 코드가 단일 위치에서 사용되는 한 루프 내에서 스위치를 수행하는 것이 허용 될 수 있습니다. 그러나 유형별로 선택한 행을 계산하는 것과 같은 다른 연산을 추가 할 수 있다면 Matt 대답의 아이디어를 사용하여 코드를 리팩터링하는 것이 좋습니다. – Phil1970