Грамматически правильные двузначные идентификаторы, множественные версии
Рассмотрим соединения двух существительных, которые на естественном английском языке чаще всего появлялись бы в форме "существительное существительного", например. "направление света", "выход фильтра". При программировании мы обычно пишем "LightDirection" и "FilterOutput".
Теперь у меня проблема с множественными существительными. Есть два случая:
1) единственное число
например. "объединение (двух) множеств", "пересечение (двух) сегментов"
Что правильно, SetUnion и SegmentIntersection или SetsUnion и SegmentsIninterection?
2) множественное число
Существует два подкадра:
(a) Многие элементы, каждый из которых имеет множество связанных элементов, например. "выходы фильтров"
(b) Многие элементы, каждый из которых имеет один связанный элемент, например. "направления векторов"
Должен ли я использовать FilterOutputs и VectorDirections или FiltersOutputs и VectorsDirections?
Я подозреваю, что правильная версия - первая версия (FilterOutupts, VectorDirections), но я думаю, что это может привести к двусмысленности, например.
- FilterOutputs - много выходов одного фильтра или много выходов многих фильтров?
- LineSegmentProjections - проекции многих сегментов или много проекций одного сегмента?
Каковы общие правила, я должен следовать?
Ответы
Ответ 1
Там за этим вопросом лежит грамматическое недоразумение. Когда мы включаем фразу формы:
1. X of Y
в
2. Y X
Y изменяет грамматическую роль от существительного в притяжательной (1) до прилагательного в атрибуте (2). Поэтому, хотя в (1) можно умножать как X, так и Y, в (2) можно только умножать X, потому что Y в (2) является прилагательным, а прилагательные не имеют грамматическое число.
Следовательно, например, SetsUnion
не соответствует английскому. Вы можете использовать его, если он вам подходит, но вы ухаживаете за непроходимостью, и я советую против этого.
Postscript
В частности, рассмотрим два других притяжательных построения: сначала старомодное построение, использующее притяжательное местоимение "его", единственное:
3a. Y, its X
эквивалентное множественное число:
4a. Ys, their X
и их сокращения, причем 4b гораздо реже, чем 3b:
3b. Y X
4b. Ys' X
Здесь SetsUnion
предполагает, что это рендеринг сингулярного притяжательного типа (3) Set Union
(= Set, its Union
), где вы намеревались сообщать о множественном притяжательном (4) Sets, their Union
(сокращенном до меньшего общий Sets' Union
).
Поэтому он активно вводит в заблуждение.
Ответ 2
Если вы не получаете hamstrung системой, управляемой конвенцией (ruby on rails, cakePHP и т.д.), почему бы не использовать OutputsOfFilters, UnionOfSets и т.д.? Они могут быть не обычными, но они могут быть более ясными.
Например, довольно ясно, что ProjectionOfLineSegments и ProjectionsOfLineSegment - это разные вещи или даже ProjectionsOfLineSegments....
Ответ 3
Использование множественных форм существительных может затруднить их чтение.
Когда у вас есть несколько вещей, они обычно хранятся в структуре данных - массиве, списке, карте, множестве и т.д., обычно называемом коллекцией, или абстрактный тип данных. Интерфейс для набора элементов обычно является частью среды программирования (например, коллекции в java и .net, STL на С++), и разработчики хорошо понимают, что они включают количество элементов.
Вы можете избежать плюрализации ваших существительных и сделать то, что вы имеете дело с множественными количествами в явном виде, и указать, как к ним можно получить доступ, включив имя коллекции. Например,
- VectorDirectionList - перечислены векторы и их направления, например. какой-то тип пары. Особенно хорошо работает, если у вас есть VectorDirection, объединяющий вектор и направление.
- VectorDirectionMap - если векторные направления отображаются из вектора.
Поскольку тип коллекции, относящийся к нескольким объектам, понимается как эндемичный для типа коллекции. Затем он помещает его в тот же класс, что и SetUnion - объединение всегда включает в себя не менее 2 наборов, а VectorDirectionList дает понять, что может быть более одного VectorDirection.
Я соглашаюсь избегать омонимов, где слово имеет более одного класса слов, например. Filter, (и фактически, Set, хотя, на мой взгляд, Set не будет использоваться в имени класса как глагол, поэтому я интерпретирую его как существительное.) Я изначально написал это, используя FilterOutput, но это не хорошо читайте. Использование соединения для фильтра может помочь устранить неоднозначность - например, ImageFilterOutputs (или применяя мою собственную привлекательность, это будет ImageFilterOutputList.)
Избежать множественных форм с именами классов кажется естественным, если учесть, что экземпляр класса сам по себе всегда один элемент - "экземпляр". Если мы используем множественное имя, мы получаем несоответствие - экземпляр, предполагающий, что это несколько вещей - это само по себе одно дело, даже если оно ссылается на несколько других вещей. Именование названий выше основывается на этом - у вас есть экземпляр, который представляет собой список, карту и т.д., Поэтому нет рассогласования.
Я предполагаю, что вы говорите о конструкциях языка программирования, хотя одно и то же мышление относится к таблицам/представлениям. Они понимаются как включающие количество элементов, а имена таблиц, следовательно, часто являются единичными (Customer, Order, Item), хотя они хранят несколько строк. Таблицы сопоставления "многие ко многим" обычно являются соединениями связанных между собой сущностей. связанные с заказами - OrderItem. По моему опыту использование множественного числа для имен таблиц затрудняет чтение SQL.
Подводя итог, я бы избегал множественных чисел, поскольку они усложняют чтение. Бывают случаи, когда они неизбежны - где использование множественной формы более читаемо, чем создание огромного имени вложенных сущностей и коллекций, но они являются исключением, чем правило.
Ответ 4
Каковы общие правила, я должен следовать?
- Сделайте это Очистить - для зрительных и слуховых мыслителей.
- Сделайте это Конкретным, но точным.
- Пройдите тест "Переполненный номер" или "Экстренный телефонный звонок" .
Чтобы проиллюстрировать пример SetsUnion:
-
"SetsUnion" сразу; Он легко путается для опечатки и говорит об этом (даже в вашей голове), будет путать его с "Set Union" (или хуже).
-
Также подразумевается множественное число, поэтому 2-й 's' является избыточным.
SetUnion лучше, но все еще неоднозначно.
-
UnionOfSets понятнее и должен быть минимальным стандартом.
-
Но все это до сих пор бесполезно расплывчато (если вы не работаете с чистой математической теорией).
Этот термин действительно должен быть конкретным. Например, "Красные автомобили", "Программисты, которые потратили слишком много времени на эзотерику" и т.д.
Это все союзы множеств, но они говорят вам что-то полезное.; -)
.
Наконец, Фил Фактор имел право на это. Перефразировать:
Можете ли вы выкрикнуть (термин) в переполненном помещении и включить его, и успешно (используется), слушателем с другой стороны?
Попробуйте орать "SetsUnion" или даже "UnionOfSets" через упакованный ирландский бар.; -)
Ответ 5
1) я бы использовал SetUnion и SegmentIntersection, потому что я думаю, что в этом случае множественность подразумевается в любом случае, и это выглядит лучше всего.
2), я буду использовать FilterOutputs и VectorDirections по той же причине. вы всегда можете использовать MultipleFilterOutputs, если хотите быть более конкретным.
но в конечном итоге это полностью зависит от ваших личных предпочтений.
Ответ 6
Я думаю, что, хотя общие соглашения об именах и согласованность важны, но в очень сложном/сложном алгоритме ясность должна превзойти соглашение. Если это помогает, используйте veryLongAndDescriptiveIdentifiers.
Ответ 7
Что случилось с Union()?
Более того, "объединение множеств" превращается в "совокупность" объединения (объединение двух множеств...); Я уверен, что я не единственный человек, который согласен с CamelCase, но не CamelsCaseMinusApostrophes. Если для этого нужен апостроф, не используйте его. Set.Union() читается точно так же, как "объединение множества (ов)".
Математизация также скажет "объединение (объединение) A и B", или редко "A и B (set) union". "Объединение множеств A и B" не имеет смысла!
Большинство людей также будут видеть Vector[] vectors
и Directions[] vectorDirections
и считать, что векторы [i] соответствуют vectorDirections [i]. Если вещи действительно становятся двусмысленными, я использую нечто вроде vector_by_index и vectorDirection_by_index. Тогда вы можете иметь Map<Filter,Output> output_by_filter
или Map<Filter,Output[]> outputs_by_filter
, что делает очень очевидным, что такое ключ (это очень важно в Objective-C, где совершенно неочевидно, какой тип ключей или значений).
Если вы действительно хотите, вы можете добавить s и получить vectors_by_index, но тогда согласованность дает вам глупый outputss_by_filter.
Правильно, конечно, что-то вроде struct FilterState {Filter filter; Выходные [] выходы; }; FilterState [] filterStates;.
Ответ 8
Я предлагаю исключительные слова для первого слова: SetUnion
, VectorDirections
и т.д.
Сделайте быстрый поиск по классам в вашей среде IDE, для: Строки *, Наборы *, Векторы *, Коллекции *
В любом случае, что бы вы ни выбрали, быть последовательным во всем приложении.