Как разбить большой класс - PullRequest
2 голосов
/ 24 июля 2009

У меня есть большой класс Shape, экземпляры которого могут (должны) делать много вещей. У меня есть много классов фигур «домен», которые наследуются от этого класса, но не предоставляют никакой другой функциональности, кроме рисования самих себя.

Я попытался создать подкласс класса Shape, но тогда все объекты «домена» будутвсе еще наследуют этот подкласс.

Как мне разбить класс? (это 300 строк текста, C #)

Ответы [ 4 ]

8 голосов
/ 24 июля 2009

300 строк мне кажется разумным.

опубликуйте код, если вам действительно нужна лучшая помощь

7 голосов
/ 24 июля 2009

Пара идей (больше похоже на эвристику):

1) Изучите поля класса. Если группа полей используется только в нескольких методах, это может быть признаком того, что эта группа полей и методы, которые ее используют, могут принадлежать другому классу.

2) Предполагая, что класс с хорошим именем,сравните имя класса с тем, что на самом деле делает класс. Если вы найдете методы, которые делают вещи сверх того, что вы ожидаете от имени класса, это может быть признаком того, что эти методы принадлежат другому классу. Например, если ваш класс представляет Customer, но также открывает, закрывает и записывает в файл журнала, разбейте код файла журнала на класс Logger. См. Также: Принцип единой ответственности (PDF) для некоторых интересных идей.

3) Если некоторые методы в первую очередь вызывают методы одного другого класса, это может быть признаком того, что эти методы должныбыть перемещенным в класс, который они часто используют (например, Зависть к функциям).

ВНИМАНИЕ: Как говорится, расставаться сложно. Если есть риск расстаться с классом, вы можете захотеть провести некоторые тесты, чтобы вы знали, что ничего не нарушаете в процессе рефакторинга. Вы можете прочитать " Эффективная работа с устаревшим кодом " и книгу " Refactoring ".

2 голосов
/ 24 июля 2009

Вы можете разбить, делегируя функции другим вспомогательным классам.

, но я согласен, что 300 строк кода не так уж страшны.

+ 1 для размещения кода

1 голос
/ 24 июля 2009

Спасибо за код.

Вот несколько вещей, которые вы можете попробовать:

1) Рефакторинг дубликата кода. Этот вид кода дублировался примерно семь раз:

       Visio.Cell pinX = GetLayoutCell(Visio.VisCellIndices.visXFormPinX);
        if (pinX != null)
        {
            pinX.set_Result("cm", value);
        }

Примечание: PinY также вычисляет pinX, но не использует его значение.

Подобное дублирование существует в: Pos {X, Y}{Start, End}

Что делает этот класс более сложным, так это то, что он является оберткой вокруг уже сложного класса.

Не очень хорошо знаю область (хотя я экспертс концепцией Shape, Circle, Square) я бы соблазнил разбить класс на несколько классов, каждый из которых имеет один и тот же базовый объект Shape.

Вот эскиз:

class EnvironShape {
   private ShapeProperties _properties;   // contains property management code
   private ShapeCollection _children;     // contains code for acting on children
   private Decorators      _decorators;   // code for accessing decorators
   private Layers          _layers;       // layer management code
   private Position        _position;     // code for working with the shape's position
   // Other code omitted
}

Я бы не стал сразу и напрямую выставлять эти объекты (например, общедоступный ShapeCollection GetChildren ()), но я бы начал с делегирования EnvironShape этим объектам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...