banner
biuaxia

biuaxia

"万物皆有裂痕,那是光进来的地方。"
github
bilibili
tg_channel

【転載】優れたオープンソースソフトウェアのクラスは、どのように命名されているのか?

title: 【転載】優れたオープンソースソフトウェアのクラスは、どのように命名されているのか?
date: 2021-08-12 14:57:51
comment: false
toc: true
category:

  • テクニック
    tags:
  • 転載
  • オープンソース
  • ソフトウェア
  • 命名

この記事は、優れたオープンソースソフトウェアのクラスは、どのように命名されているのか?から転載されています。


日常のコーディングにおいて、コードの命名は大きな学問です。オープンソースソフトウェアのコード構造や意図を迅速に理解することも、必須の能力です。それでは、彼らにはどのような規則があるのでしょうか?

Java プロジェクトのコード構造は、その設計理念を反映しています。Java は長い命名方式を採用してクラスの命名を規定し、主要な意図を自ら表現できるようにしています。高度な IDE と組み合わせることで、コーディング担当者の記憶負担を軽減し、曖昧なマッチングで必要なリソースを見つけることができます。

命名のパターンをより良く理解してもらうために、最も人気のある Java オープンソースソフトウェア(Spring シリーズ、Netty、libGDX、Guava、Logback など)を参考にし、10 種類の一般的なクラス命名をまとめました。大多数は接尾辞形式で存在し、複数の意味を表現するために組み合わせて使用できるものも多くあります。

image-20210810135355862.png

これらの単語は非常にシンプルですが、あなたのクラス命名をよりクリーンでプロフェッショナルに見せることができます。次に、各タイプに応じた例を用意して、皆さんを案内します。

管理クラス命名#

コードを書く上で、統一リソースの管理は欠かせません。明確な起動プロセスは、コードを効果的に整理することができます。プログラムを実行するためには、さまざまなリソースの登録、調整、公共集合リソースの管理が必要です。

Bootstrap,Starter#

一般的にプログラムの起動器として使用されるか、起動器の基底クラスとして使用されます。簡単に言えば、main 関数のエントリと考えることができます。

AbstractBootstrap
ServerBootstrap
MacosXApplicationStarter
DNSTaskStarter

Processor#

特定の機能の処理器で、ある処理プロセスを表すために使用される、一連のコードスニペットの集合です。順序に関するコードの命名がわからない場合は、これを使用すると、より洗練された印象を与えます。

CompoundProcessor
BinaryComparisonProcessor
DefaultDefaultValueProcessor

Manager#

生命状態を持つオブジェクトを管理し、通常は特定のリソースの管理エントリとして機能します。

AccountManager
DevicePolicyManager
TransactionManager

Holder#

特定のオブジェクトまたはオブジェクトの参照を保持し、統一的に管理できることを示します。回収が難しいメモリの統一処理や、いくつかのグローバル集合コンテナのキャッシュでよく見られます。

QueryHolder
InstructionHolder
ViewHolder

Factory#

疑いなく、ファクトリパターンの命名は耳に馴染みがあります。特に Spring では数え切れないほど存在します。

SessionFactory
ScriptEngineFactory
LiveCaptureFactory

Provider#

Provider = 戦略 + ファクトリメソッド。より高度なもので、戦略パターンとメソッドファクトリを組み合わせて、使いやすくしています。Provider は通常インターフェースまたは抽象クラスで、子実装を完了できるようにします。

AccountFeatureProvider
ApplicationFeatureProviderImpl
CollatorProvider

Registrar#

一連のリソースを登録および管理します。

ImportServiceRegistrar
IKryoRegistrar
PipelineOptionsRegistrar

Engine#

通常はコアモジュールで、特定の機能を処理します。エンジンは非常に高度な用語で、一般的なクラスはそれを使用する資格がありません。

ScriptEngine
DataQLScriptEngine
C2DEngine

Service#

特定のサービス。あまりにも簡単なので、例を挙げるのは控えます。範囲が広すぎるので、乱用しないでください。

IntegratorServiceImpl
ISelectionService
PersistenceService

Task#

特定のタスク。通常は runnable です。

WorkflowTask
FutureTask
ForkJoinTask

伝播クラス命名#

統計クラスやグローバルクラスの機能を完了するために、一部のパラメータは最後まで伝播する必要があります。伝播クラスのオブジェクトは、統一的に封装された方法で伝達され、適切な場所でコピーまたは更新されます。

Context#

プログラムが実行されるとき、いくつかの変数があり、関数の実行エントリから大量のサブ関数が完了するまで伝播する必要があります。これらの変数や集合をパラメータ形式で渡すと、コードが非常に冗長になります。この時、変数を Context に統一して、単一のオブジェクト形式で伝達することができます。

Java では、ThreadLocal の存在により、Context はパラメータ間で伝播する必要すらありません。

AppContext
ServletContext
ApplicationContext

Propagator#

伝播、繁殖。context 内で伝播される値をコピー、追加、削除、リセット、検索、復元などのアクションを行うために使用されます。通常、propagate というメソッドを提供し、実際の変数管理を実現します。

TextMapPropagator
FilePropagator
TransactionPropagator

コールバッククラス命名#

マルチコアを使用することでプログラムの実行効率を向上させることができますが、非同期化を避けることはできません。非同期タスクの実行結果を取得し、タスク実行プロセスの重要なポイントをチェックするための手段が必要です。コールバッククラス API は、リスニングや通知などの形式でこれらのイベントを取得できます。

Handler,Callback,Trigger,Listener#

callback は通常、特定のメッセージに応答して後続の処理を行うためのインターフェースです。Handler は通常、実際のメッセージ処理ロジックを保持するオブジェクトを示し、状態を持ちます。trigger は特定のイベントの処理を表し、Handler に属し、通常はクラスの命名には現れません。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#

ストレージに関連し、通常はメモリアロケータまたはマネージャを示します。プログラムが規則的に大きなメモリブロックを要求する必要がある場合、allocator は最適な選択です。

AbstractByteBufAllocator
ArrayAllocator
RecyclingIntBlockAllocator

Chunk#

メモリの一部を示します。特定のストレージリソースを抽象化し、統一的に管理したい場合に使用できます。

EncryptedChunk
ChunkFactory
MultiChunk

Arena#

英語で「舞台」や「競技場」を意味します。Linux がメモリ管理に使用して広めたため、さまざまなストレージリソースの要求、解放、管理に広く使用されています。異なる仕様のストレージ chunk に舞台を提供することは、非常に象徴的な表現です。

重要なのは、この言葉が美しいことで、接尾辞としてクラス名を魅力的に見せます。

BookingArena
StandaloneArena
PoolArena

Pool#

プールを示します。メモリプール、スレッドプール、接続プール、プールはどれも利用可能です。

ConnectionPool
ObjectPool
MemoryPool

フィルタ検出クラス命名#

プログラムが受け取るイベントや情報は非常に多く、一部は合法であり、一部はフィルタリングして捨てる必要があります。使用範囲や機能の違いに応じて、フィルタリング操作にはさまざまな形式があります。フレームワーククラスのコードには、このような用語が大量に見られます。

Pipeline,Chain#

一般的に責任連鎖パターンで使用されます。Netty、Spring MVC、Tomcat などには大量のアプリケーションがあります。特定の処理プロセスを責任連鎖の特定の位置に追加することで、前の処理プロセスの結果を受け取り、強制的に機能を追加または変更できます。Linux のパイプ操作のように、最終的に望む結果を構築します。

Pipeline
ChildPipeline
DefaultResourceTransformerChain
FilterChain

Filter#

フィルタは、特定の条件を満たすデータセットを選別するために使用されるか、特定の条件を満たすときに一部のロジックを実行します。責任連鎖と接続することで、通常は多段階のフィルタリングを実現できます。

FilenameFilter
AfterFirstEventTimeFilter
ScanFilter

Interceptor#

インターセプターは、実際には Filter と似ています。しかし、Tomcat では、Interceptor は controller オブジェクトを取得できますが、filter はできません。インターセプターはフィルタ内に包まれています。

HttpRequestInterceptor

Evaluator#

英語で「評価器」を意味します。特定の条件が成立するかどうかを判断するために使用され、一般的に内部メソッドevaluateは bool 型を返します。例えば、非常に複雑なオブジェクトや文字列を渡して、正否を判断します。

ScriptEvaluator
SubtractionExpressionEvaluator
StreamEvaluator

Detector#

探知器。特定の探知イベントの管理に使用され、発生時にキャッチして応答できます。例えば、Android のジェスチャー検出や温度検出などです。

FileHandlerReloadingDetector
TransformGestureDetector 
ScaleGestureDetector

構造クラス命名#

基本的なデータ構造(配列、リンクリスト、キュー、スタックなど)に加えて、他のより高次の一般的な抽象クラスは、コミュニケーションを大幅に減少させ、一般的な変化をカプセル化できます。

Cache#

これは特に言うことはありません、単にキャッシュです。大きなキャッシュです。一般的なキャッシュアルゴリズムには LRU、LFU、FIFO などがあります。

LoadingCache
EhCacheCache

Buffer#

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#

集約器で、集約計算を行うことができます。例えば、分庫分表の sum、max、min などの集約関数の集約です。

BigDecimalMaxAggregator
PipelineAggregator
TotalAggregator

Iterator#

イテレータ。Java のイテレータインターフェースを実装することも、自分自身のイテレーション方法を持つこともできます。データセットが非常に大きい場合、深いトラバースを行う必要があり、イテレータは必須です。イテレータを使用すると、イテレーション中に特定の要素を安全に削除できます。

BreakIterator
StringCharacterIterator

Batch#

一度に実行できるリクエストやオブジェクトのバッチです。

SavedObjectBatch
BatchRequest

Limiter#

レートリミッターで、バーストアルゴリズムやトークンバケットを使用してスムーズな制限を実現します。

DefaultTimepointLimiter
RateLimiter
TimeBasedLimiter

一般的なデザインパターン命名#

デザインパターンは名詞の重災区であり、ここでは最も一般的に使用されるいくつかを挙げます。

Strategy#

抽象部分とその実装部分を分離し、両方が独立して変化できるようにします。戦略パターン。相同インターフェース、異なる実装クラス、同一メソッドの結果が異なる、実装戦略が異なる。例えば、設定ファイルは xml に置くか、json ファイルに置くか、異なるプロバイダーを使用して命名できます。

RemoteAddressStrategy
StrategyRegistration
AppStrategy

Adapter#

あるクラスのインターフェースを顧客が望む別のインターフェースに変換します。Adapter パターンは、元々インターフェースが互換性がないために一緒に動作できなかったクラスを一緒に動作させます。

ただし、従来のアダプターを使用して API を接続する場合、特定の Handler 内にメソッドが非常に多い場合は、Adapter を使用していくつかのデフォルトメソッドを実装し、他のクラスが使用する際には Adapter を継承し、オーバーライドしたいメソッドを再定義するだけで済みます。これも Adapter の一般的な使用法です。

ExtendedPropertiesAdapter
ArrayObjectAdapter
CardGridCursorAdapter

Action,Command#

リクエストをオブジェクトとしてカプセル化し、異なるリクエストで顧客をパラメータ化し、リクエストをキューに入れたり、リクエストログを記録したり、可逆操作をサポートしたりします。

一連のアクション指令を示し、コマンドパターンを実現し、一連のアクションや機能をカプセル化します。Action は一般的に UI 操作に使用され、バックエンドフレームワークでも無差別に使用できます。

DDD の概念では、CQRS の Command の C は Command を意味します。

DeleteAction
BoardCommand

Event#

一連のイベントを示します。一般的に、意味的には、Action、Command などは能動的にトリガーされ、Event は受動的にトリガーされます。

ObservesProtectedEvent
KeyEvent

Delegate#

代理または委任パターン。委任パターンは、委任者が行うべきことを別の委任者に処理させることです。

LayoutlibDelegate
FragmentDelegate

Builder#

複雑なオブジェクトの構築とその表現を分離し、同じ構築プロセスで異なる表現を作成できるようにします。

ビルダーパターンの標準命名です。例えば、StringBuilder です。当然、StringBuffer は異例です。これも、ルールは人が定めたものであり、人もそれを破ることができることを示しています。

JsonBuilder
RequestBuilder

Template#

テンプレートメソッドクラスの命名。操作のアルゴリズムの骨組みを定義し、一部のステップをサブクラスに遅延させます。テンプレートメソッドは、サブクラスがアルゴリズムの構造を変更することなく、特定のステップを再定義できるようにします。

JDBCTemplate

Proxy#

プロキシパターン。他のオブジェクトに対して、そのオブジェクトへのアクセスを制御するためのプロキシを提供します。

ProxyFactory 
SlowQueryProxy

解析クラス命名#

コードを書く上で、大量の文字列解析、日付解析、オブジェクト変換などが必要です。意味や使用場面の違いに応じて、さまざまに分かれます。

Converter,Resolver#

変換と解析。一般的に異なるオブジェクト間のフォーマット変換に使用され、一種のオブジェクトを別のものに変換します。注意すべきは、意味の違いであり、特に複雑な変換やロードプロセスの必要がある場合は Resolver を使用できます。

DataSetToListConverter
LayoutCommandLineConverter
InitRefResolver
MustacheViewResolver

Parser#

非常に複雑なパーサーを示すために使用されます。例えば DSL の解析です。

SQLParser
JSONParser

Customizer#

特定のオブジェクトに特別な設定を行うために使用されます。これらの設定プロセスは特に複雑であるため、個別に抽出してカスタム設定を行う価値があります。

ContextCustomizer
DeviceFieldCustomizer

Formatter#

フォーマットクラス。主に文字列、数字、または日付のフォーマット処理に使用されます。

DateFormatter
StringFormatter

ネットワーククラス命名#

ネットワークプログラミングの同僚が避けられないいくつかの用語です。

Packet#

通常、ネットワークプログラミングにおけるデータパケットに使用されます。

DhcpPacket
PacketBuffer

Protocol#

同様にネットワークプログラミングに使用され、特定のプロトコルを示します。

RedisProtocol
HttpProtocol

Encoder、Decoder、Codec#

エンコーダーとデコーダーです。

RedisEncoder
RedisDecoder
RedisCodec

Request,Response#

一般的にネットワークリクエストの入出力に使用されます。非ネットワークリクエストのメソッドに使用すると、奇妙に見えます。

CRUD 命名#

これは面白いもので、統一された Controller、Service、Repository には特に言うことはありません。しかし、DDD を使用する場合は、DDD の命名規則に従う必要があります。

DDD は一般的なプログラミングの範疇に属さないため、その用語についてはあまり詳しく説明しません。

その他#

Util,Helper#

どちらもユーティリティクラスを示し、Util は一般的に無状態で、Helper はインスタンスを作成する必要があります。しかし、一般的には Tool を接尾辞として使用することはありません。

HttpUtil
TestKeyFieldHelper
CreationHelper

Mode,Type#

mode という接尾辞を見たら、このクラスはおそらく列挙型であると推測できます。通常、一般的な可能性を列挙クラスにリストアップし、他の場所でこの Mode を参照できます。

OperationMode
BridgeMode
ActionType

Invoker,Invocation#

invoker は一種のインターフェースで、通常はリフレクションやトリガーの方法で、特定のビジネスロジックを実行します。invoke メソッドを抽象化することで、invoke 実行前に引数を記録または処理し、invoke 実行後に結果や例外を処理することができます。これは AOP で一般的な操作方法です。

MethodInvoker
Invoker
ConstructorInvocation

Initializer#

アプリケーションが起動するために大量の初期化操作を必要とする場合、それを独立させて初期化アクションを専門に処理する必要があります。

MultiBackgroundInitialize
ApplicationContextInitializer

Feature,Promise#

これらはマルチスレッド間でデータを伝達するために使用されます。

Feature は操作の将来の結果を表すプレースホルダーに相当します。一般的に get を通じて直接ブロックして結果を得るか、非同期に実行して callback で結果を返します。

しかし、コールバックの中にコールバックが埋め込まれている場合、階層が非常に深くなると、コールバック地獄になります。Java の CompletableFuture は実際には Promise であり、コールバック地獄の問題を解決するために存在します。Promise はコードを美しくするために存在します。

Selector#

一連の条件に基づいて、対応する同類のリソースを取得します。Factory に似ていますが、単一のリソースのみを処理します。

X509CertSelector
NodeSelector

Reporter#

特定の実行結果を報告するために使用されます。

ExtentHtmlReporter
MetricReporter

Constants#

一般的に定数リストに使用されます。

Accessor#

一連の get および set メソッドをカプセル化したクラスです。Lombok には Accessors 注釈があり、これらのメソッドを生成します。しかし、Accessor クラスは一般的に計算を通じて get および set を完了し、変数を直接操作することはありません。これは比較的複雑なオブジェクトのアクセスサービスに適しています。

ComponentAccessor
StompHeaderAccessor

Generator#

生成器で、一般的にコード生成や ID 生成に使用されます。

CodeGenerator
CipherKeyGenerator

終わり#

コードを書き、ソースコードを見て、どうしても意会や神通が必要です。コードは感覚を持ち、命名も魅力的であるべきです。命名が良ければ、コードは見た目が良くなり、皆も好むでしょう。

説明できないことがあれば、一段のコードを見せれば、私たちは理解できます!それがどれほど神秘的か!

実際、専門的で優れたコードを書くためには、あまり多くの英単語を理解する必要はありません。大多数の場面では、英語の 4 級のような素晴らしいレベルは必要ありません。限られた単語で、コード界のハリウッドの感覚を楽しむことができます。

この記事を読んだ後、オープンソースソフトウェアのコードを見て、これが理にかなっているかどうかを確認してください。

上記の命名は、さまざまなフレームワークに頻繁に存在します。これらの用語を理解すれば、大部分のソースコードを読む際に障害はないと言えます。同じシーンで、これらの用語を優先的に使用することは、すでに皆の暗黙の規範となっています。

多くの用語はデザインパターンから来ていますが、特定の場面で特別な単語が使用されていることもあります。例えば Provider、その違いをじっくり感じ取ってください。

命名はコーディングにおいて非常に重要な要素であり、皆さんがその規則を見つけ、コードの機能を強化し、見た目を良くすることを願っています。皆さんの給与が上昇し、あなたの専門性と職人精神に見合うものとなりますように。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。