Какие функции должны быть методами класса, а какие должны быть функциями модуля?

Привет всем. Вопрос по ООП.
Я пишу прогу для шифрования/дешифрования. Делаю класс шифровальщика по алгоритму DES, внутри которого будут методы encrypt, decrypt, getKey и setKey и т.д. Эти методы будут вызываться внешней программой. Но по ходу реализации алгоритма мне приходится создавать вспомогательные функции, например, такие как stringToBitArr (преобразует строку в массив битов) или permute (переставляет биты в шифруемом блоке) или chunk(list, n) (разбивает массив на n равных частей). Они как бы не представляют собой функционал модуля, а просто помогают реализовывать главные методы моего класса. (setKey, getKey, encrypt, decrypt и т.д.)

Так вот вопрос: куда засовывать эти вспомогательные функции, внутрь класса как скрытые методы (типо _chunk, с подчеркиванием впереди) или вынести наружу в модуль как обычные функции. Скачал из интернета пару примеров на Python и у всех по-разному: кто-то все засунул в класс, кто-то часть вынес наружу, а кто-то оставил в классе только методы encrypt и decrypt, не могу понять, как лучше сделать. Пишу на Node js.

Мне кажется логичным следующий вариант: если функция не имеет отношения к алгоритму шифрования (напр, chunk - разбивает массив/буфер на равные части), т.е. она может быть использована в каких-то других контекстах, а не только в моей шифрующей проге, то ее стоит вынести из класса. Хотелось бы узнать мнение опытных людей.
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
trapwalker
@trapwalker
Программист, энтузиаст
Мне кажется логичным следующий вариант: если функция не имеет отношения к алгоритму шифрования (напр, chunk - разбивает массив/буфер на равные части), т.е. она может быть использована в каких-то других контекстах, а не только в моей шифрующей проге, то ее стоит вынести из класса.

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

Войдите, чтобы написать ответ

Похожие вопросы