精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

代碼命名規范是真優雅呀!代碼如詩

jf_ro2CN3Fa ? 來源:小姐姐味道 ? 2023-03-13 09:32 ? 次閱讀


日常編碼中,代碼的命名是個大的學問。能快速的看懂開源軟件的代碼結構和意圖,也是一項必備的能力。那它們有什么規律呢?

Java項目的代碼結構,能夠體現它的設計理念。Java采用長命名的方式來規范類的命名,能夠自己表達它的主要意圖。配合高級的IDE,可以減少編碼人員的記憶負擔,靠模糊的匹配就能找到自己所需要的資源。

為了讓大家更好的理解命名的套路,我借鑒了最流行的Java接開源軟件(spring系列,netty,libgdx,guava,logback等等),總結了10類常見的類命名。大多數是以后綴形式存在的,也有不少可以組合使用,用來表達多重的意義。

e5f8c4fa-c02f-11ed-bfe3-dac502259ad0.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 = 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 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

回調類命名

使用多核可以增加程序運行的效率,不可避免的引入異步化。我們需要有一定的手段,獲取異步任務執行的結果,對任務執行過程中的關鍵點進行檢查?;卣{類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

原文標題:新來了個同事,代碼命名規范是真優雅呀!代碼如詩??!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何讓你的Python代碼優雅又地道

    pythonic的代碼簡練,明確,優雅,絕大部分時候執行效率高。閱讀pythonic的代碼能體會到“代碼是寫給人看的,只是順便讓機器能運行”暢快。這篇文章是網友Jeff Paine整理
    的頭像 發表于 02-03 12:35 ?4517次閱讀

    代碼里的命名規則:錯誤的和正確的對比

    的意思(下訂單這個場景中,“customersInOrder” 要比 “list” 好)。清楚的代碼:var allCustomers;var customersInOrder;命名時編碼規范保持一致,讓
    發表于 06-13 22:33

    關于Android命名規范

    第一家公司是如此的重要,如果開發流程規范,對你之后的影響不是一般的大!而我經歷的公司大都不成體系,我的習慣就是我的規范!哈哈!很多的技術人員,恐怕都認為除了自己的作品外,別人寫的代碼都是“垃圾
    發表于 10-15 00:11

    關于Android命名規范

    第一家公司是如此的重要,如果開發流程規范,對你之后的影響不是一般的大!而我經歷的公司大都不成體系,我的習慣就是我的規范!哈哈!很多的技術人員,恐怕都認為除了自己的作品外,別人寫的代碼都是“垃圾
    發表于 06-21 09:35

    FPGA的代碼書寫規范

    代碼書寫規范本文節選自特權同學的圖書《FPGA設計實戰演練(邏輯篇)》配套例程下載鏈接:http://pan.baidu.com/s/1pJ5bCtt 雖然沒有“國際標準”級別的Verilog或
    發表于 04-16 04:08

    FPGA代碼的信號命名和定義

    在設計中,我們不斷的給目錄、源代碼、文件、函數、變量、參數、類、封包進行命名與定義。當一件工作需要進行的次數非常之多,足以證明它是不可或缺的基本工作。我們一定要知道一點,基礎工作是整個項目的基石
    發表于 05-07 06:35

    Verilog代碼書寫規范

    Verilog代碼書寫規范規范的目的是提高書寫代碼的可讀性、可修改性、可重用性,優化代碼綜合和仿真的結果,指導設計工程師使用
    發表于 04-15 09:47 ?106次下載

    verilog代碼規范

    verilog代碼規范,學會寫代碼還不行,我們需要更加的規范
    發表于 03-25 14:43 ?24次下載

    讓你的 Python 代碼優雅又地道

    vs NP (pythonic vs non-pythonic)的討論。pythonic的代碼簡練,明確,優雅,絕大部分時候執行效率高。閱讀pythonic的代碼能體會到“代碼是寫給
    的頭像 發表于 03-06 10:35 ?3545次閱讀

    如何提高代碼性能、使代碼遠離Bug、令代碼優雅

    背景:如何更規范化編寫Java代碼的重要性想必毋需多言,其中最重要的幾點當屬提高代碼性能、使代碼遠離Bug、令代碼
    的頭像 發表于 08-17 09:42 ?1309次閱讀

    怎么樣才能讓Java代碼編寫更規范

    cars? 忘川如斯,擁有一切的人才更怕失去。 背景:如何更規范化編寫Java 代碼的重要性想必毋需多言,其中最重要的幾點當屬提高代碼性能、使代碼遠離Bug、令
    的頭像 發表于 08-27 09:31 ?3583次閱讀

    科普一下Verilog代碼命名規范

    命名規范包括模塊命名規范代碼命名規范
    的頭像 發表于 11-17 09:54 ?3562次閱讀

    代碼編程規范命名規范

    標識符的命名規則歷來是一個敏感話題,典型的命名風格如unix風格、windows風格等,從來無法達成共識。實際上,各種風格都有其優勢也有其劣勢,而且往往和個人的審美觀有關。對標識符定義主要是為了讓團隊的代碼看起來盡可能統一,有利
    的頭像 發表于 02-15 14:57 ?1207次閱讀

    C語言代碼規范

    1. 前言 本文是AliOS Things提供的一套C語言代碼規范,適用的對象為符合C99標準的C語言工程。 2. 命名 本節內容均為建議,不作強制要求。 2.1. 總則 各種命名均使
    的頭像 發表于 06-22 10:38 ?845次閱讀

    FPGA的Verilog代碼編寫規范

      注:以R起頭的是對編寫Verilog代碼的IP設計者所做的強制性規定,以G起頭的條款是建議采用的規范。每個設計者遵守本規范可鍛煉命名規范
    的頭像 發表于 08-15 16:23 ?1847次閱讀