⚠️本文爲掘金社區首發簽約文章,未獲受權禁止轉載算法
平常編碼中,代碼的命名是個大的學問。能快速的看懂開源軟件的代碼結構和意圖,也是一項必備的能力。那它們有什麼規律呢?spring
Java項目的代碼結構,可以體現它的設計理念。Java採用長命名的方式來規範類的命名,可以本身表達它的主要意圖。配合高級的IDE,能夠減小編碼人員的記憶負擔,靠模糊的匹配就能找到本身所須要的資源。編程
爲了讓你們更好的理解命名的套路,我借鑑了最流行的Java接開源軟件(spring系列,netty,libgdx,guava,logback等等),總結了10類常見的類命名。大多數是之後綴形式存在的,也有很多能夠組合使用,用來表達多重的意義。json
這些單詞很簡單,但可讓你的類命名看起來更加清爽和專業。接下來,我將帶你們遊覽一遍。爲了方便理解,每種類型,我都配備了相應的 示例。後端
寫代碼,少不了對統一資源的管理,清晰的啓動過程能夠有效的組織代碼。爲了讓程序運行起來,少不了各類資源的註冊、調度,少不了公共集合資源的管理。設計模式
通常做爲程序啓動器使用,或者做爲啓動器的基類。通俗來講,能夠認爲是main函數的入口。api
AbstractBootstrap
ServerBootstrap
MacosXApplicationStarter
DNSTaskStarter
複製代碼
某一類功能的處理器,用來表示某個處理過程,是一系列代碼片斷的集合。若是你不知道一些順序類的代碼怎麼命名,就可使用它,顯得高大上一些。數組
CompoundProcessor
BinaryComparisonProcessor
DefaultDefaultValueProcessor
複製代碼
對有生命狀態的對象進行管理,一般做爲某一類資源的管理入口。緩存
AccountManager
DevicePolicyManager
TransactionManager
複製代碼
表示持有某個或者某類對象的引用,並能夠對其進行統一管理。多見於很差回收的內存統一處理,或者一些全局集合容器的緩存。安全
QueryHolder
InstructionHolder
ViewHolder
複製代碼
毫無疑問,工廠模式的命名,耳熟能詳。尤爲是Spring中,多不勝數。
SessionFactory
ScriptEngineFactory
LiveCaptureFactory
複製代碼
Provider = Strategy + Factory Method。它更高級一些,把策略模式和方法工廠揉在了一塊,讓人用起來很順手。Provider通常是接口或者抽象類,以便可以完成子實現。
AccountFeatureProvider
ApplicationFeatureProviderImpl
CollatorProvider
複製代碼
註冊並管理一系列資源。
ImportServiceRegistrar
IKryoRegistrar
PipelineOptionsRegistrar
複製代碼
通常是核心模塊,用來處理一類功能。引擎是個很是高級的名詞,通常的類是沒有資格用它的。
ScriptEngine
DataQLScriptEngine
C2DEngine
複製代碼
某個服務。太簡單,不忍舉例。範圍太廣,不要濫用哦。
IntegratorServiceImpl
ISelectionService
PersistenceService
複製代碼
某個任務。一般是個runnable
WorkflowTask
FutureTask
ForkJoinTask
複製代碼
爲了完成一些統計類或者全局類的功能,有些參數須要一傳到底。傳播類的對象就能夠經過統一封裝的方式進行傳遞,並在合適的地方進行拷貝或者更新。
若是你的程序執行,有一些變量,須要從函數執行的入口開始,一直傳到大量子函數執行完畢以後。這些變量或者集合,若是以參數的形式傳遞,將會讓代碼變得冗長無比。這個時候,你就能夠把變量統一塞到Context裏面,以單個對象的形式進行傳遞。
在Java中,因爲ThreadLocal的存在,Context甚至能夠不用在參數之間進行傳遞。
AppContext
ServletContext
ApplicationContext
複製代碼
傳播,繁殖。用來將context中傳遞的值進行復制,添加,清除,重置,檢索,恢復等動做。一般,它會提供一個叫作propagate的方法,實現真正的變量管理。
TextMapPropagator
FilePropagator
TransactionPropagator
複製代碼
使用多核能夠增長程序運行的效率,不可避免的引入異步化。咱們須要有必定的手段,獲取異步任務執行的結果,對任務執行過程當中的關鍵點進行檢查。回調類API能夠經過監聽、通知等形式,獲取這些事件。
callback一般是一個接口,用於響應某類消息,進行後續處理;Handler一般表示持有真正消息處理邏輯的對象,它是有狀態的;tigger觸發器表明某類事件的處理,屬於Handler,一般不會出如今類的命名中;Listener的應用更加侷限,一般在觀察者模式中用來表示特定的含義。
ChannelHandler
SuccessCallback
CronTrigger
EventListener
複製代碼
Aware就是感知的意思,通常以該單詞結尾的類,都實現了Aware接口。拿spring來講,Aware 的目的是爲了讓bean獲取spring容器的服務。具體回調方法由子類實現,好比ApplicationContextAware。它有點回調的意思。
ApplicationContextAware
ApplicationStartupAware
ApplicationEventPublisherAware
複製代碼
如今的程序都比較複雜,運行狀態監控已經成爲居家必備之良品。監控數據的收集每每須要侵入到程序的邊邊角角,如何有效的與正常業務進行區分,是很是有必要的。
表示監控數據。不要用Monitor了,比較醜。
TimelineMetric
HistogramMetric
Metric
複製代碼
估計,統計。用於計算某一類統計數值的計算器。
ConditionalDensityEstimator
FixedFrameRateEstimator
NestableLoadProfileEstimator
複製代碼
累加器的意思。用來緩存累加的中間計算結果,並提供讀取通道。
AbstractAccumulator
StatsAccumulator
TopFrequencyAccumulator
複製代碼
通常用於記錄日誌或者監控值,一般用於apm中。
VelocityTracker
RocketTracker
MediaTracker
複製代碼
若是你的應用用到了自定義的內存管理,那麼下面這些名詞是繞不開的。好比Netty,就實現了本身的內存管理機制。
與存儲相關,一般表示內存分配器或者管理器。若是你得程序須要申請有規律得大塊內存,allocator是你得不二選擇。
AbstractByteBufAllocator
ArrayAllocator
RecyclingIntBlockAllocator
複製代碼
表示一塊內存。若是你想要對一類存儲資源進行抽象,並統一管理,能夠採用它。
EncryptedChunk
ChunkFactory
MultiChunk
複製代碼
英文是舞臺、競技場的意思。因爲Linux把它用在內存管理上發揚光大,它廣泛用於各類存儲資源的申請、釋放與管理。爲不一樣規格的存儲chunk提供舞臺,好像也是很是形象的表示。
關鍵是,這個詞很美,做爲後綴讓類名顯得很漂亮。
BookingArena
StandaloneArena
PoolArena
複製代碼
表示池子。內存池,線程池,鏈接池,池池可用。
ConnectionPool
ObjectPool
MemoryPool
複製代碼
程序收到的事件和信息是很是多的,有些是合法的,有些須要過濾扔掉。根據不一樣的使用範圍和功能性差異,過濾操做也有多種形式。你會在框架類代碼中發現大量這樣的名詞。
通常用在責任鏈模式中。Netty,Spring MVC,Tomcat等都有大量應用。經過將某個處理過程加入到責任鏈的某個位置中,就能夠接收前面處理過程的結果,強制添加或者改變某些功能。就像Linux的管道操做同樣,最終構造出想要的結果。
Pipeline
ChildPipeline
DefaultResourceTransformerChain
FilterChain
複製代碼
過濾器,用來篩選某些知足條件的數據集,或者在知足某些條件的時候執行一部分邏輯。若是和責任鏈鏈接起來,則一般可以實現多級的過濾。
FilenameFilter
AfterFirstEventTimeFilter
ScanFilter
複製代碼
攔截器,其實和Filter差很少。不過在Tomcat中,Interceptor能夠拿到controller對象,但filter不行。攔截器是被包裹在過濾器中。
HttpRequestInterceptor
複製代碼
英文裏是評估器的意思。可用於判斷某些條件是否成立,通常內部方法evaluate
會返回bool類型。好比你傳遞進去一個很是複雜的對象,或者字符串,進行正確與否的判斷。
ScriptEvaluator
SubtractionExpressionEvaluator
StreamEvaluator
複製代碼
探測器。用來管理一系列探測性事件,並在發生的時候可以進行捕獲和響應。好比Android的手勢檢測,溫度檢測等。
FileHandlerReloadingDetector
TransformGestureDetector
ScaleGestureDetector
複製代碼
除了基本的數據結構,如數組、鏈表、隊列、棧等,其餘更高一層的常見抽象類,可以大量減小你們的交流,並能封裝常見的變化。
這個沒啥好說的,就是緩存。大塊的緩存。常見的緩存算法有LRU、LFU、FIFO等。
LoadingCache
EhCacheCache
複製代碼
buffer是緩衝,不一樣於緩存,它通常用在數據寫入階段。
ByteBuffer
RingBuffer
DirectByteBuffer
複製代碼
將類似的組件進行組合,並以相同的接口或者功能進行暴露,使用者不知道這究竟是一個組合體仍是其餘個體。
CompositeData
CompositeMap
ScrolledComposite
複製代碼
用來包裝某個對象,作一些額外的處理,以便增長或者去掉某些功能。
IsoBufferWrapper
ResponseWrapper
MavenWrapperDownloader
複製代碼
用來表示配置信息。說實話,它和Properties的區別並不大,但因爲Option一般是一個類,因此功能能夠擴展的更強大一些。它一般比Config的級別更小,關注的也是單個屬性的值。Param通常是做爲參數存在,對象生成的速度要快一些。
SpecificationOption
SelectOption
AlarmParam
ModelParam
複製代碼
元組的概念。因爲Java中缺少元組結構,咱們一般會自定義這樣的類。
Tuple2
Tuple3
複製代碼
聚合器,能夠作一些聚合計算。好比分庫分表中的sum,max,min等聚合函數的聚集。
BigDecimalMaxAggregator
PipelineAggregator
TotalAggregator
複製代碼
迭代器。能夠實現Java的迭代器接口,也能夠有本身的迭代方式。在數據集很大的時候,須要進行深度遍歷,迭代器能夠說是必備的。使用迭代器還能夠在迭代過程當中安全的刪除某些元素。
BreakIterator
StringCharacterIterator
複製代碼
某些能夠批量執行的請求或者對象。
SavedObjectBatch
BatchRequest
複製代碼
限流器,使用漏桶算法或者令牌桶來完成平滑的限流。
DefaultTimepointLimiter
RateLimiter
TimeBasedLimiter
複製代碼
設計模式是名詞的重災區,這裏只列出最常使用的幾個。
將抽象部分與它的實現部分分離,使它們均可以獨立地變化。策略模式。相同接口,不一樣實現類,同一方法結果不一樣,實現策略不一樣。好比一個配置文件,是放在xml裏,仍是放在json文件裏,均可以使用不一樣的provider去命名。
RemoteAddressStrategy
StrategyRegistration
AppStrategy
複製代碼
將一個類的接口轉換爲客戶但願的另外一個接口,Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類一塊兒工做。
不過,相對於傳統的適配器進行api轉接,若是你的某個Handler裏面方法特別的多,可使用Adapter實現一些默認的方法進行0適配。那麼其餘類使用的時候,只須要繼承Adapter,而後重寫他想要重寫的方法就能夠了。這也是Adapter的常見用法。
ExtendedPropertiesAdapter
ArrayObjectAdapter
CardGridCursorAdapter
複製代碼
將一個請求封裝爲一個對象,從而使你可用不一樣的請求對客戶進行參數化,對請求排隊或記錄請求日誌,以及支持可撤銷的操做。
用來表示一系列動做指令,用來實現命令模式,封裝一系列動做或者功能。Action通常用在UI操做上,後端框架能夠無差異的使用。
在DDD的概念中,CQRS的Command的C,既爲Command。
DeleteAction
BoardCommand
複製代碼
表示一系列事件。通常的,在語義上,Action,Command等,來自於主動觸發;Event來自於被動觸發。
ObservesProtectedEvent
KeyEvent
複製代碼
代理或者委託模式。委託模式是將一件屬於委託者作的事情,交給另一個被委託者來處理。
LayoutlibDelegate
FragmentDelegate
複製代碼
將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。
構建者模式的標準命名。好比StringBuilder。固然StringBuffer是個另類。這也說明了,規則是人定的,人也能夠破壞。
JsonBuilder
RequestBuilder
複製代碼
模板方法類的命名。定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。
JDBCTemplate
複製代碼
代理模式。爲其餘對象提供一種代理以控制對這個對象的訪問。
ProxyFactory
SlowQueryProxy
複製代碼
寫代碼要涉及到大量的字符串解析、日期解析、對象轉換等。根據語義和使用場合的區別,它們也分爲多種。
轉換和解析。通常用於不一樣對象之間的格式轉換,把一類對象轉換成另外一類。注意它們語義上的區別,通常特別複雜的轉換或者有加載過程的需求,可使用Resolver。
DataSetToListConverter
LayoutCommandLineConverter
InitRefResolver
MustacheViewResolver
複製代碼
用來表示很是複雜的解析器,好比解析DSL。
SQLParser
JSONParser
複製代碼
用來表示對某個對象進行特別的配置。因爲這些配置過程特別的複雜,值得單獨提取出來進行自定義設置。
ContextCustomizer
DeviceFieldCustomizer
複製代碼
格式化類。主要用於字符串、數字或者日期的格式化處理工做。
DateFormatter
StringFormatter
複製代碼
網絡編程的同窗,永遠繞不過去的幾個名詞。
一般用於網絡編程中的數據包。
DhcpPacket
PacketBuffer
複製代碼
一樣用戶網絡編程中,用來表示某個協議。
RedisProtocol
HttpProtocol
複製代碼
編碼解碼器
RedisEncoder
RedisDecoder
RedisCodec
複製代碼
通常用於網絡請求的進和出。若是你用在非網絡請求的方法上,會顯得很怪異。
這個就有意思多了,統一的Controller,Service,Repository,沒什麼好說的。但你一旦用了DDD,那就得按照DDD那一套的命名來。
因爲DDD不屬於通用編程範疇,它的名詞就很少作介紹了。
都表示工具類,Util通常是無狀態的,Helper以便須要建立實例才能使用。可是通常沒有使用Tool做爲後綴的。
HttpUtil
TestKeyFieldHelper
CreationHelper
複製代碼
看到mode這個後綴,就能猜到這個類大機率是枚舉。它一般把常見的可能性都列到枚舉類裏面,其餘地方就能夠引用這個Mode。
OperationMode
BridgeMode
ActionType
複製代碼
invoker是一類接口,一般會以反射或者觸發的方式,執行一些具體的業務邏輯。經過抽象出invoke方法,能夠在invoke執行以前對入參進行記錄或者處理;在invoke執行以後對結果和異常進行處理,是AOP中常見的操做方式。
MethodInvoker
Invoker
ConstructorInvocation
複製代碼
若是你的應用程序,須要通過大量的初始化操做才能啓動,那就須要把它獨立出來,專門處理初始化動做。
MultiBackgroundInitialize
ApplicationContextInitializer
複製代碼
它們都是用在多線程之間的,進行數據傳遞。
Feture至關於一個佔位符,表明一個操做未來的結果。通常經過get能夠直接阻塞獲得結果,或者讓它異步執行而後經過callback回調結果。
但若是回調中嵌入了回調呢?若是層次很深,就是回調地獄。Java中的CompletableFuture其實就是Promise,用來解決回調地獄問題。Promise是爲了讓代碼變得優美而存在的。
根據一系列條件,得到相應的同類資源。它比較像Factory,但只處理單項資源。
X509CertSelector
NodeSelector
複製代碼
用來彙報某些執行結果。
ExtentHtmlReporter
MetricReporter
複製代碼
通常用於常量列表。
封裝了一系列get和set方法的類。像lombok就有Accessors註解,生成這些方法。但Accessor類通常是要經過計算來完成get和set,而不是直接操做變量。這適合比較複雜的對象存取服務。
ComponentAccessor
StompHeaderAccessor
複製代碼
生成器,通常用於生成代碼,生成id等。
CodeGenerator
CipherKeyGenerator
複製代碼
寫代碼,看源碼,怎麼少得了意會和神通?代碼要帶感,命名也風騷。命名起的好,代碼會看起來很爽,你們也都喜歡。
說不清楚的事情,給一段代碼,咱就能懂!就是這麼神奇!
其實,寫專業牛b的代碼,並不須要瞭解太多的英文單詞,大多數時候用不着英文4級這麼了不得的水平。只須要有限的單詞,就能玩出代碼界好萊塢的感受。
看完本文以後,翻一翻開源軟件的代碼們,看看是否是這個理?
上面這些命名,高頻率存在於各類框架中。你要是搞懂了這些名詞,閱讀大部分源代碼能夠說是一點障礙都沒有了。在同一個場景下,優先使用這些名詞,已是你們心領神會的規範。
有不少名詞來自於設計模式,但又在特定場合使用了比較特殊的單詞,好比Provider,你們仔細感覺下其中的區別就能夠了。
命名是編碼中很是重要的一環,但願你們找到其中的規律,讓你的代碼功能上強大,顏值上好看;祝你們的薪資水漲船高,配得上你的這份專業和工匠精神。
⚠️本文爲掘金社區首發簽約文章,未獲受權禁止轉載