У меня возникла проблема, которая для меня новая. В принципе, кто-то уже написал класс A. Важные части выглядит как этотРефакторинг и предотвращение дублирования кода
class A{
// some instance variables
public A(){
// Calls methods
build();
// Calls more methods
}
private build(){
item = makeItem();
anotherItem = makeAnotherItem();
// more code
}
private makeItem(){
// Does some things and calls updateItem()
}
private updateItem(){
// Does some things with instance variables of class A
// and calls yet another method in class A.
}
Моя проблема заключается в том, что сборка() делает именно то, что мне нужно, но мне это нужно в другом классе. Теперь вот проблемы:
- класс А делает намного больше, чем то, что я написал, и поэтому я не могу создать его объект. Это было бы бессмысленно.
- Я пробовал копировать метод build() для моего класса B. Однако build() использует другие методы. И поэтому я должен их скопировать и, конечно, они называют другие методы и используют переменные экземпляра, объявленные другими способами. В принципе, мне пришлось бы копировать 200 строк кода.
Я предполагаю, что эта проблема на самом деле имеет имя, но я не знаю, что она называется, и поэтому искала только некоторые основные термины. Что я могу сделать, чтобы использовать build() в моем классе B?
Сделайте это 'public', удалите ненужные методы, создайте экземпляр' A' и используйте 'build()'. Или, если состояние не важно, сделайте его «статическим» классом и используйте 'build()' напрямую. – Maroun
Первый подход: Извлечь общий код в отдельный абстрактный класс AbstractA, сделать A и B расширением AbstractA. Второй подход: извлечь общий код в конкретном классе C и использовать C в качестве делегата в A и B.Могут быть другие решения, но невозможно помочь вам больше без конкретного кода. –
«класс А делает намного больше, чем то, что я написал» - убедитесь, что это имеет смысл, прежде чем спускаться по кроличьей дыре. Помимо этого вы можете смотреть на шаблон «Builder». – ChiefTwoPencils