Что лучше: один класс с незаполненными атрибутами или несколько классов с заполненными атрибутами?

У меня есть класс с именем Page в моей программе. Он имеет 10 атрибутов, но в определенный момент необходимы только 3 атрибута (RawPage), а в другой момент нужны все или почти все атрибуты (ProcessedPage).

Лучше иметь только один класс со всеми атрибутами или разделить эти классы на два класса, по одному на каждую потребность?

РЕДАКТИРОВАТЬ: обработанные атрибуты являются новыми атрибутами на странице, и не перезаписывают ни один.

3 ответа

Решение

Я подозреваю, что кто-то предложит здесь использовать наследование, но я не буду... звучит так, будто вы логически создаете "обработанную страницу" из "необработанной страницы" (посредством обработки) - так почему бы не смоделировать ее именно так?

class ProcessedPage
{
    private final RawPage source;

    // Other stuff - the results of the processing
}

class RawPage
{
    // The data you need here

    public ProcessedPage process(...)
}

Когда у класса есть информация, которая только иногда действительна / необходима / актуальна, с ней довольно сложно работать, особенно с ростом системы. С более явной моделью вы потенциально можете получить некоторое дублирование, но ваши занятия в конечном итоге будут иметь более четко определенную цель в жизни, а не страдать от множественного расстройства личности.

Обратите внимание, что я не сделал ProcessedPage подкласс RawPage - потому что я не думаю, что вы обычно хотели бы лечить ProcessedPage как RawPage, потенциально перерабатывая его. Вы можете хотеть иметь общий интерфейс, который они оба реализуют, который не включает process метод, конечно, но это немного отличается.

Ответ зависит. Если атрибуты не связаны, могут быть классифицированы, то имеет смысл разделить текущий класс на два.

Однако если атрибуты имеют отношение обобщение - специализация, то вы можете иметь один класс в качестве базового и поместить остальные атрибуты в другой класс, который является расширением первого класса.

Шаш

Они точно такие же атрибуты? Иногда у вас могут быть атрибуты в логических областях данных, которые имеют одинаковое имя, но различное контекстное значение. Это тот случай для вашего сценария? Если нет, то я бы сказал, пойти с одним классом, если только нет поведения, связанного с RawPage, которое вы хотите инкапсулировать иначе, чем для вашего ProcessedPage.

Другие вопросы по тегам