TL;DR
-
Если фреймворк называется AEConicalGradient, должны ли классы в нем называться ConicalGradientLayer и ConicalGradientView или просто Layer strong > и Просмотр?
-
Если фреймворк называется AELog, и он имеет класс, также называемый AELog, а другой класс Линия с некоторым обратным вызовом делегата, который использует этот тип Линия, как реализовать этот делегат, если ваш код также определил тип с именем Линия, поскольку добавление имени фрейма в качестве префикса в подпись метода
func didLog(line: AELog.Line)
будет делать error'Line' is not a member type of 'AELog'
, который на самом деле не является (частью структуры AELog, но не является членом класса AELog).
Подробнее
При обновлении нескольких платформ для Swift 3 у меня появилось много других соображений о том, что такое правильное соглашение об именах для классов Framework в зависимости от самого имени фрейма.
В конце я понял, что на самом деле я не использовал одно и то же соглашение для разных фреймворков, поэтому теперь мне не нравится эта непротиворечивость.
Я перейду прямо к некоторым реальным примерам, с которыми я столкнулся:
1. Пример: Framework не имеет класса с именем в качестве имени фрейма:
Framework называется AEConicalGradient и состоит из 2 открытых классов:
- Подкласс CALayer
- Подкласс UIView
Какое должно быть имя для каждого из этих классов?
a) AEConicalGradientLayer и AEConicalGradientView
b) ConicalGradientLayer и ConicalGradientView
c) Слой и Просмотр
Обсуждение:
a) Я использовал это в первой версии фреймворка с обоими этими классами в одном файле AEConicalGradient.swift. Мне больше не нравится этот подход, я разделяю источники на несколько файлов, поэтому теперь я думаю о подходах b > и c).
b) В этом подходе мне нравится тот факт, что кто-то может просто перетащить эти файлы в проект (например, без использования какого-либо менеджера зависимостей) или скопировать/вставить код, и он слишком сильно не потеряет контекст (из-за четких имен) но с другой стороны это звучит немного повторяемо, если вы думаете об этом как AEConicalGradient.ConicalGradientLayer и AEConicalGradient.ConicalGradientView.
c) AEConicalGradient.Layer и AEConicalGradient.View звучит так, как я этого хочу, но с другой стороны, они с большей вероятностью могут вступить в конфликт, если кто-то их собственные классы Layer или View, или если они просто перетаскивают файлы или копируют/вставляют контекст кода, в значительной степени теряются (например, что это за Layer или Просмотр для?).
2. Пример: Framework имеет класс с именем в качестве имени фрейма:
Framework называется AELog и состоит из 3 общедоступных классов и протокола делегатов:
- Общий экземпляр (и делегат для него)
- Модель строки журнала
- Config
Обсуждение:
a) Как и в первом примере в первой версии фреймворка, я имел классы с именем AELog, AELogDelegate, AELogLine и AELogConfig - все внутри одного файла AELog.swift.
b) В последнем обновлении для Swift 3 у меня появилось несколько файлов и имена классов: AELog, AELogDelegate, Линия и Config.
Это, когда я понял, что если вы import AELog
и реализуете AELogDelegate
(у которого есть только func didLog(line: Line)
) И у вас уже есть другой класс Line
, определенный в вашем собственном модуле , это приведет к конфликту, который может быть решена только путем переименования одного из двух классов Line
!
Честно говоря, я действительно не понимаю, как этого избежать. Поскольку, если вы попытаетесь использовать тип пространства имен в методе делегата, например func didLog(line: AELog.Line)
, вы получите ошибку 'Line' is not a member type of 'AELog'
, которая на самом деле не является (она является частью структуры AELog, но не является членом AELog class внутри.)
Это, когда я начал немного беспокоиться об этом "свободном" наименовании. Любые предложения или мнения по этому конкретному вопросу?
c) В духе очень "свободного" наименования, например, в 1.c), можно ли переименовать класс AELog в класс Log и AELogDelegate только Делегат? Будет ли эта ошибка исправления указана в 2.b), потому что нет класса с именем, аналогичным имени фрейма, поэтому, возможно, компилятор распознает AELog.Line?
Вопрос:
Каковы некоторые аргументы "чистого кода" для любого из этих подходов? Есть ли очевидный "правильный" способ, как это сделать? Я пропустил что-то важное здесь?