При разработке структуры данных должны ли вспомогательные методы быть доступными для других пользователей? - PullRequest
1 голос
/ 19 октября 2010

Сегодня я поговорил со своим профессором о структуре структуры данных Chunklist, над которой мы работали. По сути, это гибрид упорядоченного кругового связанного списка с каждым узлом, содержащим массив.

Поскольку это упорядоченный список, метод add () довольно сложен, поэтому я написал вложенный класс для хранения вспомогательных методов, таких как разбиение фрагмента на два более мелких чанка, поиск точки вставки, создание нового узел, среди других. Эти вспомогательные методы поддерживают размер метода не более 30 строк, но если бы все было включено, один метод был бы более 150 строк.

РЕДАКТИРОВАТЬ: уточнил точку зрения профессора

Его позиция заключалась в том, чтобы обойтись без вспомогательного класса и сделать так, чтобы он возвращал только узел и индекс внутри него, который используется итератором, и все остальное видно для точки читабельности. Я создал вспомогательный класс как ListLoc<E> ll= new ListLoc();, а доступ к методам как ll.insertItem(item), с его точки зрения, был затруднен для удобства чтения и выполнения программы. Его слова: «Я смотрю на ll как на объект чего-то, а не просто на методы экземпляра». Моя позиция заключалась в том, почему эти методы видимы, когда они оба являются неотъемлемой частью работы структуры и к ним нельзя обращаться напрямую.

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

Ответы [ 2 ]

2 голосов
/ 19 октября 2010

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

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

Кроме того, помните, что все ваши вспомогательные функции не обязательно должны быть членами класса (по крайней мере, не в C ++, другие языки могут отличаться).Вы можете создавать вспомогательные функции внутри файла .c, где вы создаете свои функции-члены и объявляете эти вспомогательные функции static, чтобы ограничить их областью действия файла.Из того, что вы описали, похоже, что все функции вашего вспомогательного класса могут быть перенесены в область видимости файла, и вы можете исключить дополнительный класс.

0 голосов
/ 19 октября 2010

Не думаю, что они должны быть видны, если их нельзя использовать.Делая их частными, продвигает гигиену в API.Но тогда их, вероятно, также нельзя называть «помощниками».

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