(У меня нет времени, чтобы красиво это написать, ниже приводится 5-минутная мозговая разрядка, которая, несомненно, может быть разорвана на разные тривальные уровни, но, пожалуйста, рассмотрите концепции и общую направленность.)
У меня есть большое сочувствие к позиции, занятой Джонатаном Гринспаном, но я хочу сказать немного больше об этом, чем это можно обоснованно сделать в комментариях.
Сначала - «хорошо сказано» Альфу Штейнбаху, который присоединился к«Только слишком упрощенные карикатуры на их точки зрения могут показаться противоречивыми. Из-за того, что это того стоит, я не согласен со Скоттом Мейерсом по этому вопросу; насколько я понимаю, он здесь слишком обобщает, или он был».
Скотт, Херб и т. Д. Делали эти замечания, когда мало кто понимал компромиссы или альтернативы, и они делали это с непропорциональной силой.Были проанализированы некоторые неприятности, с которыми люди сталкивались при разработке кода, и был рационально выведен новый подход к проектированию, направленный на эти проблемы .Давайте вернемся к вопросу о том, были ли недостатки позже, но сначала - стоит сказать, что рассматриваемая проблема, как правило, была небольшой и нечастой: функции, не являющиеся членами, являются лишь одним небольшим аспектом разработки повторно используемого кода, и в системах масштаба предприятия яРаботая над простым написанием кода того же типа, который вы поместили бы в функцию-член в качестве не-члена, достаточно редко, чтобы сделать не-члены повторно используемыми.Для них довольно редко даже выражать алгоритмы, которые являются достаточно сложными, чтобы их стоило использовать повторно, но при этом они не были тесно связаны со спецификой класса, для которого они были разработаны, - настолько странно, что практически невозможно представить, чтобы какой-то другой класс происходил при поддержкете же операции и семантика.Часто вам также нужно шаблонировать аргументы или вводить базовый класс для абстрагирования набора необходимых операций.Оба имеют существенное влияние с точки зрения производительности, будучи встроенными по сравнению с внешними, перекомпиляцией клиентского кода.
Тем не менее, при изменении реализации часто требуется меньше изменений кода и исследования влияния при изменении реализации, если операции реализуются вусловия общедоступного интерфейса, а также то, что он не является другом, не является его членом, систематически обеспечивает это.Однако иногда это делает начальную реализацию более многословной или каким-либо другим способом менее желательной и удобной в обслуживании.
Но, как лакмусовая бумажка, - сколько из этих функций, не являющихся членами, находится в том же заголовке, что и единственный классдля чего они в настоящее время применимы?Многие ли хотят абстрагировать свои аргументы с помощью шаблонов (что означает встраивание, зависимости компиляции) или базовых классов (накладные расходы на виртуальные функции), чтобы разрешить их повторное использование?Оба препятствуют тому, чтобы люди считали их повторно используемыми, но когда это не так, операции, доступные в классе, делокализованы , что может расстроить восприятие системы разработчиками: разработка часто должна разрабатывать для себя довольноразочаровывающий факт, что - «о - это будет работать только для класса X».
Итог: большинство функций-членов потенциально не могут быть повторно использованы.Большая часть корпоративного кода не разбита на чистый алгоритм по сравнению с данными с возможностью повторного использования первого.Такое разделение просто не является обязательным, полезным или, по-видимому, полезным 20 лет спустя.Это почти то же самое, что и методы get / set - они необходимы на определенных границах API, но могут представлять собой ненужную многословность, когда владение и использование кода локализовано.
Лично у меня нет all илиНичего не подойдет к этому, но решите, что сделать функцией-членом или не-членом, основываясь на том, есть ли какая-либо вероятная выгода от потенциальной возможности повторного использования или локальности интерфейса.