日常編碼中,代碼的命名是個大的學問。能快速的看懂開源軟件的代碼結構和意圖,也是一項必備的能力。那它們有什么規律呢?
Java項目的代碼結構,能夠體現它的設計理念。Java采用長命名的方式來規范類的命名,能夠自己表達它的主要意圖。配合高級的IDE,可以減少編碼人員的記憶負擔,靠模糊的匹配就能找到自己所需要的資源。
為了讓大家更好的理解命名的套路,我借鑒了最流行的Java接開源軟件(spring系列,netty,libgdx,guava,logback等等),總結了10類常見的類命名。大多數是以后綴形式存在的,也有不少可以組合使用,用來表達多重的意義。
這些單詞很簡單,但可以讓你的類命名看起來更加清爽和專業。接下來,我將帶大家游覽一遍。為了方便理解,每種類型,我都配備了相應的 示例。
管理類命名
寫代碼,少不了對統一資源的管理,清晰的啟動過程可以有效的組織代碼。為了讓程序運行起來,少不了各種資源的注冊、調度,少不了公共集合資源的管理。
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 = Strategy + Factory Method。它更高級一些,把策略模式和方法工廠揉在了一塊,讓人用起來很順手。Provider一般是接口或者抽象類,以便能夠完成子實現。
AccountFeatureProvider
ApplicationFeatureProviderImpl
CollatorProvider
Registrar
注冊并管理一系列資源。
ImportServiceRegistrar
IKryoRegistrar
PipelineOptionsRegistrar
Engine
一般是核心模塊,用來處理一類功能。引擎是個非常高級的名詞,一般的類是沒有資格用它的。
ScriptEngine
DataQLScriptEngine
C2DEngine
Service
某個服務。太簡單,不忍舉例。范圍太廣,不要濫用哦。
IntegratorServiceImpl
ISelectionService
PersistenceService
Task
某個任務。通常是個runnable
WorkflowTask
FutureTask
ForkJoinTask
基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
傳播類命名
為了完成一些統計類或者全局類的功能,有些參數需要一傳到底。傳播類的對象就可以通過統一封裝的方式進行傳遞,并在合適的地方進行拷貝或者更新。
Context
如果你的程序執行,有一些變量,需要從函數執行的入口開始,一直傳到大量子函數執行完畢之后。這些變量或者集合,如果以參數的形式傳遞,將會讓代碼變得冗長無比。這個時候,你就可以把變量統一塞到Context里面,以單個對象的形式進行傳遞。
在Java中,由于ThreadLocal的存在,Context甚至可以不用在參數之間進行傳遞。
AppContext
ServletContext
ApplicationContext
Propagator
傳播,繁殖。用來將context中傳遞的值進行復制,添加,清除,重置,檢索,恢復等動作。通常,它會提供一個叫做propagate的方法,實現真正的變量管理。
TextMapPropagator
FilePropagator
TransactionPropagator
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
回調類命名
使用多核可以增加程序運行的效率,不可避免的引入異步化。我們需要有一定的手段,獲取異步任務執行的結果,對任務執行過程中的關鍵點進行檢查?;卣{類API可以通過監聽、通知等形式,獲取這些事件。
Handler,Callback,Trigger,Listener
callback通常是一個接口,用于響應某類消息,進行后續處理;Handler通常表示持有真正消息處理邏輯的對象,它是有狀態的;tigger觸發器代表某類事件的處理,屬于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
英文里是評估器的意思??捎糜谂袛嗄承l件是否成立,一般內部方法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文件里,都可以使用不同的provider去命名。
RemoteAddressStrategy
StrategyRegistration
AppStrategy
Adapter
將一個類的接口轉換為客戶希望的另一個接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些類一起工作。
不過,相對于傳統的適配器進行api轉接,如果你的某個Handler里面方法特別的多,可以使用Adapter實現一些默認的方法進行0適配。那么其他類使用的時候,只需要繼承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
Feture,Promise
它們都是用在多線程之間的,進行數據傳遞。
Feture相當于一個占位符,代表一個操作將來的結果。一般通過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
End
寫代碼,看源碼,怎么少得了意會和神通?代碼要帶感,命名也風騷。命名起的好,代碼會看起來很爽,大家也都喜歡。
說不清楚的事情,給一段代碼,咱就能懂!就是這么神奇!
其實,寫專業牛b的代碼,并不需要了解太多的英文單詞,大多數時候用不著英文4級這么了不起的水平。只需要有限的單詞,就能玩出代碼界好萊塢的感覺。
看完本文之后,翻一翻開源軟件的代碼們,看看是不是這個理?
上面這些命名,高頻率存在于各種框架中。你要是搞懂了這些名詞,閱讀大部分源代碼可以說是一點障礙都沒有了。在同一個場景下,優先使用這些名詞,已經是大家心照不宣的規范。
有很多名詞來自于設計模式,但又在特定場合使用了比較特殊的單詞,比如Provider,大家仔細感受下其中的區別就可以了。
命名是編碼中非常重要的一環,希望大家找到其中的規律,讓你的代碼功能上強大,顏值上好看;祝大家的薪資水漲船高,配得上你的這份專業和工匠精神。
審核編輯 :李倩
-
開源軟件
+關注
關注
0文章
207瀏覽量
15782 -
JAVA
+關注
關注
19文章
2943瀏覽量
104106 -
代碼
+關注
關注
30文章
4671瀏覽量
67770
原文標題:新來了個同事,代碼命名規范是真優雅呀!代碼如詩??!
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論