Как называются классы отличного программного обеспечения с открытым исходным кодом?

Java открытый источник спецификация кода
Как называются классы отличного программного обеспечения с открытым исходным кодом?

⚠️Эта статья является первой подписанной статьей сообщества Nuggets, и её перепечатка без разрешения запрещена.

В повседневном программировании присвоение кодов имен — это большое знание. Это также необходимая способность быстро понимать структуру кода и назначение программного обеспечения с открытым исходным кодом. Так каковы их правила?

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

Чтобы все могли лучше понять процедуру именования, я использовал самое популярное программное обеспечение Java с открытым исходным кодом (весенняя серия, netty, libgdx, guava, logback и т. д.) и суммировал 10 распространенных имен классов. Большинство из них существуют в форме суффикса, и многие из них могут использоваться в комбинации для выражения нескольких значений.

image-20210810135355862.png

Эти слова просты, но могут сделать ваши имена классов более понятными и профессиональными. Далее я провожу вас на экскурсию. Для простоты понимания я привел соответствующие примеры для каждого типа.

именование класса управления

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

Начальная загрузка, Стартер

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

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, и её перепечатка без разрешения запрещена.