Какие функции поместить в класс - PullRequest
1 голос
/ 12 декабря 2010

Если у меня есть функция (скажем, messUp, которой не требуется доступ к каким-либо закрытым переменным класса (скажем, room), я должен написать функцию внутри класса, например room.messUp() или вне ее, например messUp(room)? Мне кажется, вторая версия читается лучше.

Ответы [ 4 ]

2 голосов
/ 12 декабря 2010

Здесь есть компромисс. Использование функции-члена позволяет вам:

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

Использование внешней функции позволяет:

  • Сделайте эту функцию общей, чтобы вы могли применять ее в равной степени к помещениям, складам и нефтяным вышкам (если они обеспечивают функции-члены, необходимые для неправильного использования).
  • Сохраняйте сигнатуру класса маленькой, чтобы создание фиктивных версий для модульного тестирования (или других реализаций) стало проще.
  • Изменить реализацию класса без необходимости проверять код этой функции.

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

2 голосов
/ 12 декабря 2010

Любое поведение класса объектов должно быть записано как метод экземпляра.

Таким образом, room.messUp() - это ОО способ сделать это.

Должен ли messUp иметь доступ к любомучастные члены класса или нет, не имеет значения, тот факт, что это поведение комнаты, предполагает, что это метод экземпляра, как было бы cleanUp или paint, и т. д ...

0 голосов
/ 12 декабря 2010

Я основываюсь на "Стандартах кодирования C ++: 101 правила, руководящие указания и рекомендации" Саттера и Александреску, а также SOLID Боба Мартина. Я согласен с ними в этом вопросе; -).

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

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

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

0 голосов
/ 12 декабря 2010

Не обращая внимания на какой язык, я думаю, что мой первый вопрос - связан ли messUp с какими-либо другими функциями. Если у вас есть группа связанных функций, я бы хотел добавить их в класс.

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

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

В конце концов, я не думаю, что это имеет большое значение. ООП - это просто способ упорядочить данные и логику вашего приложения. Если вы обнимете это, то вы бы выбрали room.messUp (), а не messUp (room).

...