Предположим, у меня есть приложение на C ++ для зоомагазина, которое началось только с Cats.В приложении есть класс, который выполняет некоторую обработку данных для диалогового окна Cat:
CatDlg.cpp:
CatDlg::CatDlg() {//ctor stuff}
CatDlg::onInitDialog() {
DBAccess db;
db.open();
CatRec cat;
cat = db.findRec(m_catID);
CString name = cat.getName();
NameField.SetWindowText(name);
// other catty dialogy stuff
}
Теперь владелец магазина хочет добавить Dogs в приложение.Данные о собаках, по сути, совпадают с данными Cat, за исключением типов данных.Я мог бы просто продублировать класс CatDlg, изменить несколько типов и обработать его таким образом, но это приведет к проблемам с обслуживанием и раздуванию кода с 99% дублирующимся кодом:
DogDlg.cpp:
DogDlg::onInitDialog() {
DBAccess db;
db.open();
DogRec dog;
dog = db.findRec(m_dogID);
CString name = dog.getName();
NameField.SetWindowText(name);
// other doggy dialogy stuff
}
Или я мог бы изменить класс диалога для обработки нескольких животных, передав флаг, указывающий тип животного, а затем обработать его соответствующим образом.Это также становится уродливее, так как владелец добавляет новых животных, потому что метод становится длиннее, с множеством дублированных блоков кода:
AnimalDlg.cpp:
AnimalDlg::onInitDialog(AnimalType type) {
DBAccess db;
db.open();
if(type == CAT)
{
CatRec cat;
cat = db.findRec(m_catID);
CString name = cat.getName();
}
else if(type == DOG)
{
DogRec dog;
dog = db.findRec(m_dogID);
CString name = dog.getName();
}
NameField.SetWindowText(name);
}
Какой лучший способ реорганизоватькласс, чтобы сделать его более общим?Есть ли шаблон дизайна, который я могу применить?Есть ли какой-нибудь способ перенести общий код в базовый класс, а затем создать подклассы для животных?Я быстро просмотрел книгу Фаулера по рефакторингу, но ничего не выпрыгнуло на меня.
Предположим, в классе гораздо больше кода, на данный момент специфического для типа Cat, но применимого к любому типу животных..
Спасибо за помощь!
Филипп