⚠️Эта статья является первой подписанной статьей сообщества Nuggets, и её перепечатка без разрешения запрещена.
В повседневном программировании присвоение кодов имен — это большое знание. Это также необходимая способность быстро понимать структуру кода и назначение программного обеспечения с открытым исходным кодом. Так каковы их правила?
Структура кода проекта Java может отражать философию его разработки. Java использует метод длинного именования для стандартизации именования классов, который сам по себе может выражать свое основное намерение. С расширенной IDE нагрузка на память программистов может быть уменьшена, а необходимые им ресурсы могут быть найдены путем нечеткого сопоставления.
Чтобы все могли лучше понять процедуру именования, я использовал самое популярное программное обеспечение Java с открытым исходным кодом (весенняя серия, netty, libgdx, guava, logback и т. д.) и суммировал 10 распространенных имен классов. Большинство из них существуют в форме суффикса, и многие из них могут использоваться в комбинации для выражения нескольких значений.
Эти слова просты, но могут сделать ваши имена классов более понятными и профессиональными. Далее я провожу вас на экскурсию. Для простоты понимания я привел соответствующие примеры для каждого типа.
именование класса управления
При написании кода управление унифицированными ресурсами незаменимо.Четкий процесс запуска может эффективно организовать код. Для запуска программы необходимы регистрация и планирование различных ресурсов, а также обязательно управление общедоступными коллективными ресурсами.
Начальная загрузка, Стартер
Обычно используется как средство запуска программ или как базовый класс для средств запуска. С точки зрения непрофессионала, это можно рассматривать как ввод основной функции.
AbstractBootstrap
ServerBootstrap
MacosXApplicationStarter
DNSTaskStarter
Processor
Процессор определенного типа функции, используемый для представления определенного процесса обработки, представляет собой набор серии фрагментов кода. Если вы не знаете, как называется код некоторых классов последовательности, вы можете использовать его, чтобы он выглядел выше.
CompoundProcessor
BinaryComparisonProcessor
DefaultDefaultValueProcessor
Manager
Управляйте объектами с активным состоянием, обычно как запись управления для определенного типа ресурсов.
AccountManager
DevicePolicyManager
TransactionManager
Holder
Указывает, что он содержит ссылку на объект или объект определенного типа и может управлять им единообразно. Это чаще встречается в унифицированной обработке памяти, которую нелегко переработать, или в кеше некоторых контейнеров глобальной коллекции.
QueryHolder
InstructionHolder
ViewHolder
Factory
Несомненно, название заводского режима знакомо. Особенно весной их бесчисленное множество.
SessionFactory
ScriptEngineFactory
LiveCaptureFactory
Provider
Поставщик = Стратегия + Заводской метод. Он более продвинутый и сочетает в себе шаблон стратегии и фабрику методов, что делает его очень простым в использовании. Провайдеры, как правило, представляют собой интерфейсы или абстрактные классы, так что можно выполнять подреализации.
AccountFeatureProvider
ApplicationFeatureProviderImpl
CollatorProvider
Registrar
Зарегистрируйтесь и управляйте целым рядом ресурсов.
ImportServiceRegistrar
IKryoRegistrar
PipelineOptionsRegistrar
Engine
Как правило, это основной модуль, который используется для обработки класса функций. Двигатель — это термин очень высокого уровня, и общие классы не имеют права его использовать.
ScriptEngine
DataQLScriptEngine
C2DEngine
Service
сервис. Это слишком просто, чтобы привести пример. Область применения слишком широка, не злоупотребляйте ею.
IntegratorServiceImpl
ISelectionService
PersistenceService
Task
какая-то задача. Обычно работает
WorkflowTask
FutureTask
ForkJoinTask
Именование класса распространения
Чтобы завершить функции некоторых статистических классов или глобальных классов, некоторые параметры необходимо передать в конец. Объекты распространяющегося класса могут быть переданы единым способом инкапсуляции, а также скопированы или обновлены при необходимости.
Context
Если ваша программа выполняется, есть некоторые переменные, которые необходимо передать от входа выполнения функции до тех пор, пока не будет выполнено большое количество подфункций. Эти переменные или коллекции, если они будут переданы в качестве параметров, сделают код чрезвычайно многословным. В это время вы можете поместить переменные в контекст единообразно и передать их в виде одного объекта.
В Java из-за наличия ThreadLocal контекст нельзя передавать даже между параметрами.
AppContext
ServletContext
ApplicationContext
Propagator
распространяться, размножаться. Он используется для копирования, добавления, очистки, сброса, извлечения, восстановления и т. д. значения, переданного в контексте. Обычно он предоставляет метод под названием propagate, реализующий реальное управление переменными.
TextMapPropagator
FilePropagator
TransactionPropagator
Имя класса обратного вызова
Использование нескольких ядер может повысить эффективность работы программы и неизбежно привести к асинхронности. Нам необходимо иметь определенные средства для получения результатов асинхронного выполнения задачи и проверки ключевых моментов в процессе выполнения задачи. API класса обратного вызова может получать эти события посредством мониторинга, уведомления и т. д.
Обработчик, Обратный вызов, Триггер, Слушатель
обратный вызов обычно представляет собой интерфейс, используемый для ответа на сообщение определенного типа для последующей обработки; обработчик обычно представляет собой объект, который содержит реальную логику обработки сообщения, которая имеет состояние; триггер tigger представляет собой обработку определенного типа события, принадлежащего обработчику. , обычно не будет отображаться в именовании класса; применение Listener более ограничено, и обычно он используется для выражения определенного значения в шаблоне наблюдателя.
ChannelHandler
SuccessCallback
CronTrigger
EventListener
Aware
Aware означает восприятие.Как правило, классы, оканчивающиеся на это слово, реализуют интерфейс Aware. Возьмем, к примеру, Spring. Цель Aware — позволить bean-компонентам получать услуги из контейнера Spring. Конкретные методы обратного вызова реализуются подклассами, такими как ApplicationContextAware. Это что-то вроде обратного вызова.
ApplicationContextAware
ApplicationStartupAware
ApplicationEventPublisherAware
Именование класса мониторинга
Сейчас программы усложнились, а мониторинг рабочего состояния стал обязательным продуктом дома. Сбор данных мониторинга часто должен вторгаться в уголки программы, и очень важно, как эффективно отличить его от обычного бизнеса.
Metric
Представляет данные мониторинга. Не используйте Monitor, это уродливо.
TimelineMetric
HistogramMetric
Metric
Estimator
расчеты, статистика. Калькулятор для расчета определенного типа статистики.
ConditionalDensityEstimator
FixedFrameRateEstimator
NestableLoadProfileEstimator
Accumulator
значит аккумулятор. Используется для кэширования накопленных промежуточных результатов вычислений и предоставления канала чтения.
AbstractAccumulator
StatsAccumulator
TopFrequencyAccumulator
Tracker
Обычно используется для регистрации или мониторинга значений, обычно используется в apm.
VelocityTracker
RocketTracker
MediaTracker
Именование класса управления памятью
Если ваше приложение использует пользовательское управление памятью, то нельзя избежать следующих терминов. Netty, например, реализует собственный механизм управления памятью.
Allocator
Связанный с хранилищем, обычно означает распределитель или менеджер памяти. Если ваша программа должна регулярно обращаться к большому блоку памяти, распределитель — ваш лучший выбор.
AbstractByteBufAllocator
ArrayAllocator
RecyclingIntBlockAllocator
Chunk
Представляет блок памяти. Если вы хотите абстрагировать класс ресурсов хранения и управлять ими единообразно, вы можете использовать его.
EncryptedChunk
ChunkFactory
MultiChunk
Arena
Английский означает этап и арену. Поскольку Linux использует его для дальнейшего управления памятью, он широко используется в приложении, выпуске и управлении различными ресурсами хранения. Предоставление сцены для хранения фрагментов с различными спецификациями кажется очень ярким представлением.
Дело в том, что слово красивое используется как суффикс, чтобы имя класса выглядело красиво.
BookingArena
StandaloneArena
PoolArena
Pool
Представляет собой бассейн. Пул памяти, пул потоков, пул соединений, пул пула доступны.
ConnectionPool
ObjectPool
MemoryPool
Именование класса обнаружения фильтра
Есть много событий и информации, полученных программой, некоторые из них являются законными, а некоторые нужно отфильтровать и выбросить. Существуют также различные формы операций фильтрации в зависимости от сферы использования и функциональных различий. Вы найдете много таких существительных в коде класса фреймворка.
Трубопровод, Цепь
Обычно используется в шаблоне цепочки ответственности. Netty, Spring MVC, Tomcat и т. д. имеют большое количество приложений. Добавляя процесс в определенную позицию в цепочке ответственности, вы можете получить результаты предыдущего процесса и форсировать добавление или изменение некоторых функций. Как и в случае с каналом в Linux, наконец создается желаемый результат.
Pipeline
ChildPipeline
DefaultResourceTransformerChain
FilterChain
Filter
Фильтры используются для фильтрации наборов данных, соответствующих определенным условиям, или для выполнения части логики при выполнении определенных условий. Многоуровневая фильтрация часто может быть достигнута, если она связана с цепочкой ответственности.
FilenameFilter
AfterFirstEventTimeFilter
ScanFilter
Interceptor
Перехватчик на самом деле похож на Фильтр. Однако в Tomcat перехватчик может получить объект контроллера, а фильтр — нет. Перехватчики завернуты в фильтры.
HttpRequestInterceptor
Evaluator
Это означает Оценщик на английском языке. Может использоваться для определения того, верны ли определенные условия, общие внутренние методыevaluate
вернет логический тип. Например, вы передаете очень сложный объект или строку, чтобы судить, правильно это или нет.
ScriptEvaluator
SubtractionExpressionEvaluator
StreamEvaluator
Detector
детектор. Используется для управления серией детективных событий и возможности захвата и реагирования на них по мере их возникновения. Например, обнаружение жестов Android, определение температуры и т. д.
FileHandlerReloadingDetector
TransformGestureDetector
ScaleGestureDetector
именование классов структуры
В дополнение к базовым структурам данных, таким как массивы, связанные списки, очереди, стеки и т. д., другие общие абстрактные классы на более высоком уровне могут значительно сократить общение между всеми и инкапсулировать общие изменения.
Cache
Об этом и говорить нечего, это кеш. Большие куски кеша. Общие алгоритмы кэширования включают LRU, LFU, FIFO и т. д.
LoadingCache
EhCacheCache
Buffer
Буфер — это буфер, отличный от кеша, он обычно используется на этапе записи данных.
ByteBuffer
RingBuffer
DirectByteBuffer
Composite
Сочетая похожие компоненты и выставляя их с одинаковым интерфейсом или функцией, пользователь не знает, комбинация это или другой индивидуум.
CompositeData
CompositeMap
ScrolledComposite
Wrapper
Используется для обертывания объекта и выполнения некоторой дополнительной обработки для добавления или удаления некоторых функций.
IsoBufferWrapper
ResponseWrapper
MavenWrapperDownloader
Option, Param,Attribute
Используется для представления информации о конфигурации. Честно говоря, он не сильно отличается от Properties, но поскольку Option обычно является классом, функция может быть расширена более мощно. Обычно это меньший уровень, чем Config, и он также связан со значением одного свойства. Param обычно существует как параметр, и скорость генерации объекта выше.
SpecificationOption
SelectOption
AlarmParam
ModelParam
Tuple
Концепция кортежей. Из-за отсутствия кортежной структуры в Java мы обычно настраиваем такие классы.
Tuple2
Tuple3
Aggregator
Агрегатор, который может выполнять некоторые агрегатные вычисления. Например, набор агрегатных функций, таких как сумма, максимум, минимум в подбазе данных и подтаблице.
BigDecimalMaxAggregator
PipelineAggregator
TotalAggregator
Iterator
итератор. Он может реализовывать интерфейс итератора Java или иметь собственный метод итерации. Когда набор данных большой, требуется глубокий обход, и можно сказать, что необходимы итераторы. Использование итераторов также может безопасно удалять определенные элементы во время итерации.
BreakIterator
StringCharacterIterator
Batch
Некоторые запросы или объекты, которые могут выполняться в пакетном режиме.
SavedObjectBatch
BatchRequest
Limiter
Ограничитель тока использует алгоритм дырявого ведра или ведро маркера для достижения плавного ограничения тока.
DefaultTimepointLimiter
RateLimiter
TimeBasedLimiter
Именование общего шаблона проектирования
Шаблоны проектирования больше всего страдают от существительных, и вот лишь некоторые из наиболее часто используемых.
Strategy
Отделение абстрактной части от части реализации, чтобы обе они могли меняться независимо друг от друга. режим стратегии. Тот же интерфейс, разные классы реализации, разные результаты одного и того же метода, разные стратегии реализации. Например, файл конфигурации, независимо от того, находится ли он в формате xml или json, может быть назван с использованием разных поставщиков.
RemoteAddressStrategy
StrategyRegistration
AppStrategy
Adapter
Преобразуя интерфейс одного класса в другой интерфейс, желаемый клиентом, шаблон адаптера позволяет классам работать вместе, которые в противном случае не работали бы вместе из-за несовместимых интерфейсов.
Однако по сравнению с традиционным адаптером для передачи API, если в одном из ваших обработчиков много методов, вы можете использовать адаптер для реализации некоторых методов по умолчанию для адаптации 0. Затем, когда его используют другие классы, им нужно только наследовать адаптер, а затем переписать метод, который он хочет переопределить. Это также распространенное использование адаптера.
ExtendedPropertiesAdapter
ArrayObjectAdapter
CardGridCursorAdapter
Действие, Команда
Инкапсулирует запрос в виде объекта, позволяя вам параметризовать клиентов с различными запросами, ставить в очередь или регистрировать запросы, а также поддерживать операции, которые нельзя выполнить.
Он используется для представления последовательности инструкций действий, для реализации командного режима и для инкапсуляции последовательности действий или функций. Действие обычно используется для операций пользовательского интерфейса, а внутреннюю структуру можно использовать без разбора.
В концепции DDD C команды CQRS является одновременно командой.
DeleteAction
BoardCommand
Event
Представляет последовательность событий. Как правило, семантически Действие, Команда и т. д. исходят из активного триггера, Событие — из пассивного триггера.
ObservesProtectedEvent
KeyEvent
Delegate
Режим прокси или делегата. Режим делегирования заключается в передаче задачи, принадлежащей делегатору, другому делегированному лицу для обработки.
LayoutlibDelegate
FragmentDelegate
Builder
Отделение построения сложного объекта от его представления позволяет одному и тому же процессу построения создавать различные представления.
Стандартное наименование шаблонов построителей. Например, StringBuilder. Конечно, StringBuffer является альтернативой. Это также показывает, что правила устанавливаются людьми, и люди также могут их нарушать.
JsonBuilder
RequestBuilder
Template
Имя класса метода шаблона. Определить скелет алгоритма в операции, отложив некоторые шаги на подклассы. Шаблонные методы позволяют подклассам переопределять определенные шаги алгоритма без изменения его структуры.
JDBCTemplate
Proxy
режим прокси. Предоставляет прокси для других объектов для управления доступом к этому объекту.
ProxyFactory
SlowQueryProxy
Разобрать имена классов
Написание кода включает в себя много синтаксического анализа строк, синтаксического анализа даты, преобразования объектов и т. д. Они также делятся на различные категории в соответствии с разницей в семантике и вариантах использования.
Преобразователь, Резольвер
преобразование и разбор. Обычно он используется для преобразования формата между различными объектами и преобразует один тип объекта в другой. Обратите внимание на семантическую разницу между ними.Как правило, Resolver можно использовать для особенно сложных преобразований или загрузки требований процесса.
DataSetToListConverter
LayoutCommandLineConverter
InitRefResolver
MustacheViewResolver
Parser
Используется для представления очень сложных синтаксических анализаторов, таких как синтаксический анализ DSL.
SQLParser
JSONParser
Customizer
Используется для указания конкретной конфигурации объекта. Поскольку эти процессы конфигурации особенно сложны, их стоит выделить отдельно для пользовательских настроек.
ContextCustomizer
DeviceFieldCustomizer
Formatter
Класс форматирования. В основном используется для форматирования строк, чисел или дат.
DateFormatter
StringFormatter
Именование сетевых классов
Для студентов, изучающих сетевое программирование, есть несколько существительных, которые нельзя обойти стороной.
Packet
Часто используется для пакетов в сетевом программировании.
DhcpPacket
PacketBuffer
Protocol
В том же пользовательском сетевом программировании он используется для представления определенного протокола.
RedisProtocol
HttpProtocol
Кодер, декодер, кодек
кодек
RedisEncoder
RedisDecoder
RedisCodec
Ответ на запрос
Обычно используется для входящих и исходящих сетевых запросов. Если вы используете его в несетевом методе запроса, это будет выглядеть странно.
CRUD-именование
Это гораздо интереснее, единый Контроллер, Сервис, Репозиторий, нечего сказать. Но как только вы используете DDD, вы должны следовать имени набора DDD.
Поскольку DDD не относится к категории общего программирования, его существительные вводить не будем.
разное
Утил, Помощник
Оба представляют классы инструментов, Util обычно не имеет состояния, а Helper должен создать экземпляр, прежде чем его можно будет использовать. Однако Tool обычно не используется в качестве суффикса.
HttpUtil
TestKeyFieldHelper
CreationHelper
Режим, Тип
Увидев суффикс режима, вы можете догадаться, что этот класс, скорее всего, является перечислением. Обычно в нем перечислены общие возможности класса перечисления, а на режим можно ссылаться в другом месте.
OperationMode
BridgeMode
ActionType
Инвокер, Инвокация
Вызывающий — это класс интерфейса, который обычно выполняет определенную бизнес-логику в виде отражения или запуска. Абстрагируя метод вызова, входные параметры могут быть записаны или обработаны до выполнения вызова; результаты и исключения могут быть обработаны после выполнения вызова, что является обычным методом работы в АОП.
MethodInvoker
Invoker
ConstructorInvocation
Initializer
Если вашему приложению необходимо выполнить множество операций инициализации для запуска, вам необходимо выделить его и специально заняться действиями инициализации.
MultiBackgroundInitialize
ApplicationContextInitializer
Feture, Обещание
Все они используются между несколькими потоками для передачи данных.
Feture эквивалентен заполнителю, который представляет будущий результат операции. Как правило, вы можете напрямую заблокировать результат с помощью get или позволить ему выполняться асинхронно, а затем вызвать результат с помощью обратного вызова.
Но что, если обратные вызовы встроены в обратные вызовы? Если это глубоко, это ад обратного вызова. CompletableFuture в Java на самом деле является Promise, который используется для решения проблемы ада обратных вызовов. Обещания существуют для того, чтобы сделать код красивым.
Selector
Согласно ряду условий, получите соответствующие ресурсы того же вида. Это больше похоже на Factory, но обрабатывает только один ресурс.
X509CertSelector
NodeSelector
Reporter
Используется для сообщения о некоторых результатах выполнения.
ExtentHtmlReporter
MetricReporter
Constants
Обычно используется для постоянных списков.
Accessor
Класс, который инкапсулирует набор методов get и set. Как и в случае с lombok, для создания этих методов существуют аннотации Accessors. Но класс Accessor обычно выполняет получение и установку путем вычисления, а не напрямую манипулирует переменными. Это подходит для более сложных служб доступа к объектам.
ComponentAccessor
StompHeaderAccessor
Generator
Генератор, обычно используемый для генерации кода, генерации идентификатора и т. д.
CodeGenerator
CipherKeyGenerator
End
Пишите код, смотрите исходники, как может быть меньше понимания и магических сил? Код должен иметь смысл, а нейминг должен быть кокетливым. Назовите его правильно, и код будет выглядеть круто, и всем он понравится.
Если вы не знаете, что сказать, дайте кусок кода, и мы сможем понять! Это так потрясающе!
На самом деле, чтобы писать профессиональный код, вам не нужно знать слишком много английских слов, в большинстве случаев вам не нужен такой потрясающий уровень английского 4 уровня. Используя лишь ограниченное количество слов, вы можете воспроизвести голливудское ощущение мира кода.
Прочитав эту статью, просмотрите код программного обеспечения с открытым исходным кодом, чтобы убедиться, что это правда?
Названные выше высокие частоты существуют в различных рамках. Если вы понимаете эти термины, можно сказать, что чтение большей части исходного кода вообще не является препятствием. В одной и той же сцене использование этих терминов в первую очередь является негласной нормой.
Есть много существительных, которые происходят из шаблонов проектирования, но в определенных случаях используются специальные слова, такие как Provider, Вы можете тщательно почувствовать разницу.
Нейминг — очень важная часть кодинга, я надеюсь, что каждый сможет найти правила и сделать свой код функциональным и красивым, я желаю, чтобы у всех росла зарплата и она была достойна вашего профессионализма и мастерства.
⚠️Эта статья является первой подписанной статьей сообщества Nuggets, и её перепечатка без разрешения запрещена.