⑴ 程序員如何方便的管理自己以前寫的代碼
一、代碼的最大長度。
雖然在java的編譯器中對於代碼的最大長度沒有硬性的規定。但是如果代碼的長度太長,超過了編譯器的最當行寬,顯然閱讀起來比較麻煩。為此根據筆者的經驗,通常情況下Java源代碼的行長度不應該大於80個字元。如果超過這個長度的話,在一些開發工具和編輯器上就無法很好的顯示。如需要通過滾動條來顯示後面部分的代碼。當其他項目成員閱讀這超長的代碼時,就會看得眼花繚亂。當人的溫飽問題解決了之後,就需要開始注意美觀方面的問題。所以程序開發人員在開發應用程序的時候,要盡量避免書寫長的代碼。如果代碼的每行長度確實需要超過80個字元的話(最好將每行代碼的長度控制在70個字元左右),那麼就需要對代碼進行分行。
二、在恰當的地方對代碼進行分行。
筆者建議將Java源代碼每行的長度控制在70個字元、最大不超過80個字元。當超過這個字元長度的時候,開發人員就需要考慮在恰當的地方對他們進行分行處理。不過這個分行也不是說開發人員想在哪裡進行分行就在哪裡進行分行。這個分行是有一定技巧的。雖然這些技巧大部分並不是強制性的規定,但是都是一些專家們的經驗總結,可以提高代碼的閱讀性。為此筆者希望各位程序開發能夠嚴格的遵守。
技巧一:高層折行優於低層折行。
這個技巧是說,在考慮對代碼進行折行處理的時候,需要注意代碼的層次性。如某段代碼涉及到混合四則運算,而四則運算又有明顯的運算順序,此時對代碼進行折行時就最好能夠在四則運算的關鍵順序上進行折行處理。如現在有如下的一段代碼:
Mynum=mynum1*(mynum1+mynue2+mynum3-mynum4)+8*mynum5
如果要對這段代碼進行折行的話,該在哪個地方加入一個折行符號呢?如果是筆者處理的話,筆者會按如下的格式對代碼進行折行處理。
Mynum=mynum1*(mynum1+mynue2+mynum3-mynum4)+8*mynum5
這主要是根據四則運算的運算層次來進行折行的。顯然,*符號的優先順序要比+符號要高。所以在+號前面對其進行折行處理,那麼就可以一目瞭然的反應出代碼的運算層次。可以大幅度的提高代碼的閱讀性。所以代碼折行的第一個技巧就是高層折行優於低層折行。如此的話,可以使得應用程序的結構代碼更加的清晰,更容易被團隊成員所理解。
技巧二:在運算符前面進行折行處理。
其實在如上的折行技巧中,還隱藏著一個規則,即在運算符之前進行折行。如上例所示,筆者就是在+號前面進行折行,而不是在+號後面進行折行處理。這主要也是考慮到代碼的可讀性。如上面這個例子中,如果在+號後面進行折行處理的話,則下一行就會給人一種憑空多出來的感覺,顯得代碼很不連貫。跟這個規則類似,如果在折行處理的時候遇到逗號時,那麼最好能夠在逗號後面進行折行。如在一個方法中,需要傳入5個參數。此時如果代碼行比較長,那麼就需要在幾個參數之間進行折行處理。此時最理想的折行位置,就是在某個參數的逗號後面。注意,使在逗號後面進行折行,而不是在逗號前面。因為一個參數一個逗號是匹對的。而如果一個逗號加一個參數,則讓人看起來很不舒服。
技巧三:這行代碼的對起方式。
當不得已對代碼進行折行處理時,下一行的代碼應該與其同等級的代碼行左對齊。如上例所示,在+號前面將某一段四則運算公式進行折行處理的時候,其+號符號已經採取縮進處理。其縮進後的效果就是要與其同等級的代碼行左對齊。如此的話,明眼人一看就知道這段代碼採取過折行處理;而且跟上一行代碼的層次關系。當一段代碼被分割成三行甚至跟更多行數的時候,這個規則會非常的有用。如果能夠嚴格遵守這個規則,即使將代碼分割成多行,看起來也不會覺得那麼混亂。反而給人一種比較有層次的感覺。
另外在採取縮進處理的時候,可以利用Tab鍵來提高縮進處理的效率。因為直接按空格的話,有可能空格字元數量不一致,會讓人覺得層次不起,產生比較大的混亂。一般情況下,當代碼行兩側距離頁邊的距離比較大,看其來不怎麼舒服時,可以在代碼行中通過插入TAB鍵(會在代碼行中連續插入8個字元)來提高代碼的閱讀性,讓代碼的縮進實現統一。
技巧四:為變數尋找一個合適的位置。
在編寫應用程序時,盡量將變數聲明放置在一個代碼塊的開始處,也就是說{}花括弧的開始位置。雖然說可以在需要使用變數的時候再對其進行聲明。但是筆者不同義如此操作。因為如果在的呢感到使用變數的時候再來聲明變數時,會降低代碼的可讀性。同理,也需要避免低層聲明與高層聲明重復,這樣會引起代碼混亂並可能引發程序功能性錯誤。而且這種錯誤在後續的排錯中很難被發現。為此要在應用程序開發的時候就要盡量避免這種錯誤。
在聲明變數的時候,有時候可能代碼很簡單,生命變數的行總共加起來也不會超過十個字元。此時能否把多個變數的聲明寫在同一行呢?從就技術上來說,這是可行的。也就是說,Java編譯器允許將多個變數定義在同一行上。但是從閱讀性上來說,這並不是很好的做法。筆者的建議是,即使變數定義再簡單,或者變數比較多,也最好分行進行變數的聲明。也就是說,一行聲明一個變數。這可以提高代碼的可閱讀性。而且有時候往往需要對變數加一個注釋說明變數的用途,如果以行定義一個變數,添加行注釋也相對簡單許多。
總之,以上的這些折行的規則基本上不會影響到代碼的運行。但是,對於代碼的維護與後續的排錯、升級、二次開發等等具有不可忽視的作用。而且現在基本上應用程序開發式團隊開發,故大家都遵守同樣的代碼編寫規范是非常重要的。筆者在開發一個應用程序的時候,事先都會花一定的時間,跟項目成員強調這些折行的規則。目的只有一個,就是提高代碼的可讀性,便於後續代碼的共享與維護。畢竟後續面對這些代碼的,並不是客戶,而是我們自己。我們程序員在編寫代碼的時候,不能夠搬起石頭砸自己的腳。筆者認為,現在一個合格的程序人員,不僅技術功底上要過得硬,而且還必須要遵守這些無形規則的約束。難怪現在這么多企業在挑選程序開發人員的時候,都會註明良好的編碼規范。現在對於這些無形中的條條框框,項目經理已經開始重視起來。
⑵ !~ /^\d+$/是什麼意思
!~/^d+$/ 表示對~/^d+$/返回的布爾值取反,匹配成功就返回'真',否則就返回'假'。
/^d+$/ 是正則表達式,^和$都是用來匹配位置,^表示匹配字元開頭的字元,$表示匹配字元結尾的字元;d+匹配多個數字字元串。所以/^d+$/ 表示匹配一整行中1個以上的數字。
Perl的正則表達式的三種形式,分別是匹配,替換和轉化:
匹配:m//(還可以簡寫為//,略去m)
替換:s///
轉化:tr///
這三種形式一般都和=~或!~搭配使用, =~ 表示相匹配,!~ 表示不匹配。
(2)程序員修改幾行看似不重要代碼擴展閱讀:
Perl 常用正則表達式的含義:
. 匹配除換行符以外的所有字元
x? 匹配 0 次或一次 x 字元串
x* 匹配 0 次或多次 x 字元串,但匹配可能的最少次數
x+ 匹配 1 次或多次 x 字元串,但匹配可能的最少次數
.* 匹配 0 次或多次的任何字元
.+ 匹配 1 次或多次的任何字元
{m} 匹配剛好是 m 個 的指定字元串
{m,n} 匹配在 m個 以上 n個 以下 的指定字元串
{m,} 匹配 m個 以上 的指定字元串
[] 匹配符合 [] 內的字元
[^] 匹配不符合 [] 內的字元
[0-9] 匹配所有數字字元
[a-z] 匹配所有小寫字母字元
[^0-9] 匹配所有非數字字元
[^a-z] 匹配所有非小寫字母字元
^ 匹配字元開頭的字元
$ 匹配字元結尾的字元
d 匹配一個數字的字元,和 [0-9] 語法一樣
d+ 匹配多個數字字元串,和 [0-9]+ 語法一樣
D 非數字,其他同 d
D+ 非數字,其他同 d+
w 英文字母或數字的字元串,和 [a-zA-Z0-9_] 語法一樣
w+ 和 [a-zA-Z0-9_]+ 語法一樣
W 非英文字母或數字的字元串,和 [^a-zA-Z0-9_] 語法一樣
W+ 和 [^a-zA-Z0-9_]+ 語法一樣
s 空格,和 [ f] 語法一樣
s+ 和 [ f]+ 一樣
S 非空格,和 [^ f] 語法一樣
S+ 和 [^ f]+ 語法一樣
匹配以英文字母,數字為邊界的字元串
B 匹配不以英文字母,數值為邊界的字元串
a|b|c 匹配符合a字元 或是b字元 或是c字元 的字元串
abc 匹配含有 abc 的字元串 (pattern) () 這個符號會記住所找尋到的字元串,是一個很實用的語法.第一個 () 內所找到的字元串變成 $1 這個變數或是 1 變數,第二個 () 內所找到的字元串變成 $2 這個變數或是 2 變數,以此類推下去.
/pattern/i i 這個參數表示忽略英文大小寫,也就是在匹配字元串的時候,不考慮英文的大小寫問題. 如果要在 pattern 模式中找尋一個特殊字元,如 "*",則要在這個字元前加上 符號,這樣才會讓特殊字元失效
網路-正則表達式
⑶ 程序員一分鍾多少行代碼
你好,程序員一分鍾可以寫2行代碼。但是寫代碼多是思考,速度100個字元以上就可以了。
⑷ 為什麼程序員會有代碼能跑就不要動的觀點
原因如下:
任意一段代碼,從修改到發布,再到投產。中間勢必經過多次測試和驗證,要想做到萬無一失,每次改動的回歸測試必不可少。有自動化測試還好,純手工的話,測試罵娘的心都有了。
再者,生產環境與開發環境或多或少有差異。沒有十足把握,不要輕易改動,不然改一個問題,帶出其他問題的情況很正常。正常運行,業務可正常開展。看似簡單的問題,被改出更多問題,影響業務開展,責任重大。
簡介:
程序員(英文Programmer)是從事程序開發、程序維護的基層工作人員。一般將程序員分為程序設計人員和程序編碼人員,但兩者的界限並不非常清楚。
⑸ 程序員新人周一優化一行代碼,周三被勸退
這周一,公司新來了一個同事,面試的時候表現得非常不錯,各種問題對答如流,老闆和我都倍感欣慰。
這么優秀的人,絕不能讓他浪費一分一秒,於是很快,我就發他了需求文檔、源碼,讓他先在本地熟悉一下業務和開發流程。
結果沒想到,周三大家一塊 review 代碼的時候就發現了問題,新來的同事直接把原來 @Transactional 優化成了這個鬼樣子:
就因為這一行代碼,老闆(當年也是一線互聯網大廠的好手)當場就發飆了,馬上就要勸退這位新同事,我就趕緊打圓場,畢竟自己面試的人,不看僧面看佛面,是吧?於是老闆答應我說再試用一個月看看。
會議結束後,我就趕緊讓新同事復習了一遍事務,以下是他自己做的總結,還是非常詳細的,分享出來給大家一點點參考和啟發。相信大家看完後就明白為什麼不能這樣優化 @Transactional 註解了,純屬畫蛇添足和亂用。
事務在邏輯上是一組操作, 要麼執行,要不都不執行 。主要是針對資料庫而言的,比如說 MySQL。
只要記住這一點,理解事務就很容易了。在 Java 中,我們通常要在業務裡面處理多個事件,比如說編程喵有一個保存文章的方法,它除了要保存文章本身之外,還要保存文章對應的標簽,標簽和文章不在同一個表裡,但會通過在文章表裡(posts)保存標簽主鍵(tag_id)來關聯標簽表(tags):
那麼此時就需要開啟事務,保證文章表和標簽表中的數據保持同步,要麼都執行,要麼都不執行。
否則就有可能造成,文章保存成功了,但標簽保存失敗了,或者文章保存失敗了,標簽保存成功了——這些場景都不符合我們的預期。
為了保證事務是正確可靠的,在資料庫進行寫入或者更新操作時,就必須得表現出 ACID 的 4 個重要特性:
其中,事務隔離又分為 4 種不同的級別,包括:
需要格外注意的是: 事務能否生效,取決於資料庫引擎是否支持事務,MySQL 的 InnoDB 引擎是支持事務的,但 MyISAM 就不支持 。
1)編程式事務
編程式事務是指將事務管理代碼嵌入嵌入到業務代碼中,來控制事務的提交和回滾。
你比如說,使用 TransactionTemplate 來管理事務:
再比如說,使用 TransactionManager 來管理事務:
就編程式事務管理而言,Spring 更推薦使用 TransactionTemplate。
在編程式事務中,必須在每個業務操作中包含額外的事務管理代碼,就導致代碼看起來非常的臃腫,但對理解 Spring 的事務管理模型非常有幫助。
當然了,要想實現事務管理和業務代碼的抽離,就必須得用到 Spring 當中最關鍵最核心的技術之一,AOP,其本質是對方法前後進行攔截,然後在目標方法開始之前創建或者加入一個事務,執行完目標方法之後根據執行的情況提交或者回滾。
Spring 將事務管理的核心抽象為一個事務管理器(TransactionManager),它的源碼只有一個簡單的介面定義,屬於一個標記介面:
通過 PlatformTransactionManager 這個介面,Spring 為各個平台如 JDBC(DataSourceTransactionManager)、Hibernate(HibernateTransactionManager)、JPA(JpaTransactionManager)等都提供了對應的事務管理器,但是具體的實現就是各個平台自己的事情了。
參數 TransactionDefinition 和 @Transactional 註解是對應的,比如說 @Transactional 註解中定義的事務傳播行為、隔離級別、事務超時時間、事務是否只讀等屬性,在 TransactionDefinition 都可以找得到。
返回類型 TransactionStatus 主要用來存儲當前事務的一些狀態和數據,比如說事務資源(connection)、回滾狀態等。
TransactionDefinition.java:
Transactional.java
說到這,我們來詳細地說明一下 Spring 事務的傳播行為、事務的隔離級別、事務的超時時間、事務的只讀屬性,以及事務的回滾規則。
當事務方法被另外一個事務方法調用時,必須指定事務應該如何傳播 ,例如,方法可能繼續在當前事務中執行,也可以開啟一個新的事務,在自己的事務中執行。
TransactionDefinition 一共定義了 7 種事務傳播行為:
01、 PROPAGATION_REQUIRED
這也是 @Transactional 默認的事務傳播行為,指的是如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。更確切地意思是:
這個傳播行為也最好理解,aMethod 調用了 bMethod,只要其中一個方法回滾,整個事務均回滾。
02、 PROPAGATION_REQUIRES_NEW
創建一個新的事務,如果當前存在事務,則把當前事務掛起。也就是說不管外部方法是否開啟事務,Propagation.REQUIRES_NEW 修飾的內部方法都會開啟自己的事務,且開啟的事務與外部的事務相互獨立,互不幹擾。
如果 aMethod()發生異常回滾,bMethod()不會跟著回滾,因為 bMethod()開啟了獨立的事務。但是,如果 bMethod()拋出了未被捕獲的異常並且這個異常滿足事務回滾規則的話,aMethod()同樣也會回滾。
03、 PROPAGATION_NESTED
如果當前存在事務,就在當前事務內執行;否則,就執行與 PROPAGATION_REQUIRED 類似的操作。
04、 PROPAGATION_MANDATORY
如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
05、 PROPAGATION_SUPPORTS
如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
06、 PROPAGATION_NOT_SUPPORTED
以非事務方式運行,如果當前存在事務,則把當前事務掛起。
07、 PROPAGATION_NEVER
以非事務方式運行,如果當前存在事務,則拋出異常。
3、4、5、6、7 這 5 種事務傳播方式不常用,了解即可。
前面我們已經了解了資料庫的事務隔離級別,再來理解 Spring 的事務隔離級別就容易多了。
TransactionDefinition 中一共定義了 5 種事務隔離級別:
通常情況下,我們採用默認的隔離級別 ISOLATION_DEFAULT 就可以了,也就是交給資料庫來決定,可以通過 SELECT @@transaction_isolation; 命令來查看 MySql 的默認隔離級別,結果為 REPEATABLE-READ,也就是可重復讀。
事務超時,也就是指一個事務所允許執行的最長時間,如果在超時時間內還沒有完成的話,就自動回滾。
假如事務的執行時間格外的長,由於事務涉及到對資料庫的鎖定,就會導致長時間運行的事務佔用資料庫資源。
如果一個事務只是對資料庫執行讀操作,那麼該資料庫就可以利用事務的只讀屬性,採取優化措施,適用於多條資料庫查詢操作中。
這是因為 MySql(innodb)默認對每一個連接都啟用了 autocommit 模式,在該模式下,每一個發送到 MySql 伺服器的 SQL 語句都會在一個單獨的事務中進行處理,執行結束後會自動提交事務。
那如果我們給方法加上了 @Transactional 註解,那這個方法中所有的 SQL 都會放在一個事務里。否則,每條 SQL 都會單獨開啟一個事務,中間被其他事務修改了數據,都會實時讀取到。
有些情況下,當一次執行多條查詢語句時,需要保證數據一致性時,就需要啟用事務支持。否則上一條 SQL 查詢後,被其他用戶改變了數據,那麼下一個 SQL 查詢可能就會出現不一致的狀態。
默認情況下,事務只在出現運行時異常(Runtime Exception)時回滾,以及 Error,出現檢查異常(checked exception,需要主動捕獲處理或者向上拋出)時不回滾。
如果你想要回滾特定的異常類型的話,可以這樣設置:
以前,我們需要通過 XML 配置 Spring 來託管事務,有了 Spring Boot 之後,一切就變得更加簡單了,只需要在業務層添加事務註解( @Transactional )就可以快速開啟事務。
也就是說,我們只需要把焦點放在 @Transactional 註解上就可以了。
雖然 @Transactional 註解源碼中定義了很多屬性,但大多數時候,我都是採用默認配置,當然了,如果需要自定義的話,前面也都說明過了。
1)要在 public 方法上使用,在類的computeTransactionAttribute方法中有個判斷,如果目標方法不是public,則TransactionAttribute返回null,即不支持事務。
2)避免同一個類中調用 @Transactional 註解的方法,這樣會導致事務失效。
在測試之前,我們先把 Spring Boot 默認的日誌級別 info 調整為 debug,在 application.yml 文件中 修改:
然後,來看修改之前查到的數據:
開搞。在控制器中添加一個 update 介面,准備修改數據,打算把沉默王二的狗腿子修改為沉默王二的狗腿:
在 Service 中為方法加上 @Transactional 註解並拋出運行時異常:
按照我們的預期,當執行 save 保存數據後,因為出現了異常,所以事務要回滾。所以數據不會被修改。
在瀏覽器中輸入 http://localhost:8080/user/update 進行測試,注意查看日誌,可以確認事務起效了。
當我們把事務去掉,同樣拋出異常:
再次執行,發現雖然程序報錯了,但數據卻被更新了。
這也間接地證明,我們的 @Transactional 事務起效了。
看到這,是不是就明白為什麼新同事的優化純屬畫蛇添足/卵用了吧?
⑹ 程序員都有祖傳代碼,就不會有問題了嗎
程序員被戲稱為“碼農”,天天與代碼打交道的他們按理說應該對代碼有著深厚的感情基礎,但在每個科技公司都有這樣一種代碼:多數程序員們都怕遇到,有經驗老碼農有時候也束手無策,往往一步錯、步步錯,動了一小行,改大半月。相信很多程序員都被這種代碼折磨過,就是大名鼎鼎的“祖傳代碼”
傳統觀點認為,工程技術團隊應該為代碼庫(也就是技術債務的所處環境)建立一種直觀的感受,了解其對公司的影響,而後在組織內建立信任。如果首席架構師強調重構核心代碼,那麼,開發者通常就得按照指示行動。誠然,如果公司可以對技術債務建立起一種共識與信任文化,這將有利於挽留優秀的工程師,並保持業務良好運作,但這往往需要多年努力。
⑺ 程序員小問題
合格的程序員不是根據代碼的行數來判斷的,代碼敲得飛一般的速度,只能說是個不錯的打字員。程序是為解決實際問題而存在的,要解決生活中的實際問題,掌握基本的語言知識是前提,敏捷的思維才是最有效的保障,思想才是一個東西的靈魂。所以才有演算法這么一個說法。我個人覺得一個合格的程序員不在乎他寫過多少行代碼,有多麼熟悉API(忘記啥查查就好了)。在工作中能迅速解決實際問題就行了(不過是翻閱書籍,網上,還是論壇發帖)。另外開始的時候,代碼的正確行並不是那麼重要,你要學會自己找出哪裡出錯了,剛開始可能只是一些簡單的語法錯誤,到後面語言熟悉了要求提高了就會出現邏輯錯誤,一步步解決才會一步步有成長。沒有誰規定達到怎麼一個標准才是合格的程序員。只問你能解決多少實際問題。祝前程似錦^_^