iT邦幫忙

6

有沒有辦法做到 個性化 Coding Style?

  • 分享至 

  • xImage

小弟覺得目前程式碼排版的方法好像還太原始

想激發大家對於個人客製化程式碼排版(我想稱之為re-formatter) 的想像與探討
不曉得可行性與否
如果可行,希望最終有人能著手發展這個想法

關於Coding Style

程式碼 = 將邏輯作為文字語句排列組合的樣子

每個人都有自己舒適的排版風格
就像閱讀一篇文章,文字不能完全沒有排版,需要有空格、有換行
這就是美感

世界上可能有公認最舒服的排序方式
雖說在人群間美感也許大同小異,但還是會有細微的差異

實際上,相同的排版方式對每個人來說感受都不太一樣
文章的標點符號受到筆者平時的換氣、講話習慣影響
接著,會影響到閱讀者的停頓與連貫
有人一次能閱讀5個字、有人能讀到7個字的名詞

甚至選擇不同的字型(font style) 都會影響到這些

每個人有所差異,每個人審美觀不同

現有問題及痛點

不同的程式碼風格的人要一同工作,這一直都是寫程式協作上很大的磨合成本

以下從個人與協作上的幾個面向角度出發

1. 學習新語言

每當學習一門全新的語言時,無法立刻習慣與轉換
(尤其同時寫兩門不同語言的時候)

例如:不同語言間使用不同的英文字來表達函式

  • def
  • function
  • func
  • fun
  • f

有時候我只想寫func
我不想在鍵盤上敲function這麼多字、又覺得fun過短,也不想寫成def

我希望能在javascript裡面使用func,希望func代表著function
當IDE或編譯器在函示的位置上看到func時,程式碼在執行時就會自動轉成function

a. 我希望能夠客製化一個程式語言裡的內置關鍵字 (customize program keyword)

2. 對方怎麼沒有排版

之前在公司看到兩個新人,在同一份專案間互相改來改去
A看到B寫的code怎麼都沒有排版,於是按IDE的快捷鍵
將整頁程式碼排版成IDE設定的風格,覺得自己做出了貢獻

後來B看到A寫的code,也覺得A怎麼都沒有排版
空白鍵的數目都對不上來,git比對一整片都是紅色的difference
於是也按下快捷鍵,將整頁程式碼排版成IDE設定的風格,也覺得自己做出了貢獻

兩人互相覺得,對方寫完code怎麼沒有做排版
來來回回好幾次,然後git紀錄就增長了虛肥
結果只是兩人IDE設定的tab, space不同

3. 很嚴謹的風格,但沒有也沒影響

有的專案規定比較嚴格,要求良好的寫程式習慣:

  • 要在行尾加分號
  • 每個物件的成員都要加上public或private
    (即使該語言不用加任何東西,預設就代表public的效果)
  • 頁尾要加一行空白

每次寫程式我都會留意,照著規範走
最終專案的程式碼一致也讓人看起來順眼
但有時候也會思考,我每次多打的這些字、這些留意的心力,是不是只是為了風格的一致性?

4. 段落換行空幾格

每個人看到文章段落密集、鬆散的舒適度不一樣
在段落與段落,有的人喜歡看到一行空白、有的喜歡兩行空白
有的空白數目要取決於前後文到底多長

記得國中時
我在網上寫小說都不換行、整篇密密麻麻的
然後被同學直接吐槽:『阿你家按Enter是要錢喔?』

從此我就沒省過了

5. 一行最多有幾個字

一行程式碼到底只能有多少個字元寬?

  • 80字換行
  • 120字換行
  • 不限

我不想讓程式碼被壓得太扁平,更不想看到程式碼突出螢幕範圍太多

可是有的人螢幕就真的比較大阿!!

b. 我希望每個人可以自訂排版方式,包括參數引數的換行、哪裡要留空白鍵
但只會在自己的電腦上看到,不會影響到repository
將本地的程式碼通通壓縮後(刪去全部空白以及無用輔助詞)
或者照官方公訂的標準版本排版
或者某些方式處理,才進行git比對、上傳到github


但此會衍生出一個問題,造成在github上的code可讀性不佳
希望自訂的排版方式也可以在瀏覽遠端儲存庫時套用

另外,因為手機比較小,為方便在公車捷運上也能隨時閱讀
如果這一點能搭配 a. 跨裝置整合再好不過
ex: 電腦版呈現`func` 手機版呈現`fn`(縮小尺寸)

6. 不同的地方,不同的命名Style

每種程式語言通常都會有一些習慣、推薦規範

  • 檔案名稱只能全部小寫
  • 常數要全大寫
  • 寫物件要用底線蛇形命名
  • 寫函式名稱要大駝峰命名
  • 寫函式內部變數要小駝峰命名
  • html tag, class name 要小寫搭配-號
  • html id 要小寫駝峰命名
    ...

我也知道官方推崇駝峰命名 helloWorldApiRequest

但偏偏有時候又希望能夠交雜,因為我覺得這樣變數的單字可讀性比較佳
就像我們真正在看英文單字 helloWorld_apiRequest

到底英文為什麼還要區分大小寫,哪個天才發明的
語意牽涉到語言本身符號,想往上怪罪都追溯不完

其實我還有抱有好多類似疑問
為什麼規定特殊符號只有這些!@#$%^&*()=+...
鍵盤為什麼只有這麼多按鍵

c. 我希望每個人可以自訂變數名稱的呈現方式,可以隨意調整大小寫與底線
一樣只會在自己的電腦上看到

甚至希望可以有變數名稱叫 "hello world(api request) - int64"
跳脫空白與特殊符號的限制,不用被過往程式命名規則綁死


---

以下是異想天開:
甚至有沒有空白、有沒有分隔符號或底線,只要語義對了,都代表著相同物件
"hello_world (api request) - int64"
"hello world(apiRequest) int64"

希望有天能徹底解決由人類語言本身(溝通或書寫)所產生的障礙
ex: 由多個術語描述同個實體或語義
"referer"vs"referrer"、"溼姊"vs"濕姐"、"Hello"vs"Hello"、"磁碟"vs"軟盤"、"一二三"vs"甲乙丙"

7. 不同程式語言間的整合

這個是最終極的版本,跨語言的整合

一些不同語言的規範與約定

有的html元素是self-closing tag,只有opening卻沒有closing tag

在html內優先使用雙引號
在javascript內優先使用單引號

大寫駝峰代表export
小寫駝峰代表local

字串用雙引號
字元用單引號

多行句尾都加上逗號
但最後一行有的語言要加、有的語言不能加逗號

_hello_
__hello__
...
...
...

每種程式語言都有各自不一樣的用法特色
假如每一種都寫,難道只能每一種都記憶嗎QQ

程式語言基本用法

常見的語言迴圈有這幾種寫法

for (x;x;x) {
    ...
}
for x; x; x {
    ...
}
for x in range(x):
    ...

這些有辦法自定義、或者互通嗎?

d. 我希望我寫任何的程式語言都能用目前已熟練的語言進行開發
不過考慮到型別類型與物件導向的支援度,這實際上應該不可行...


比較可行的是,希望透過設定這些關係達成程式語言的映射
能夠將if, for, function等用法,轉換成與熟悉語言類似的寫法
達成像排列積木那樣操控程式的基本邏輯

希望的願景

程式碼排版工具層出不窮,配置方式都不同
各家排版工具互相競爭紛擾、百家齊鳴
約定成俗的東西越來越多,最終產出一版又一版的 Coding Convention
導致工程師的腦容量越來越大

現在2023年11月,一進到新公司
主管馬上要你安裝某種formatter外掛,然後丟給你一包程式碼整理的工具設定檔
要求你每次寫完程式碼後,使用這套設定來做排版並上傳
目的是為了保持專案程式碼的一致性風格

但,程式碼語義應該是不受到任何排版風格影響的
這好像違背了每個人應該是看自己舒適的扣看得爽的初衷

寫程式的風格什麼時候是需要全體共同討論決定的事情呢?
辯論這個是需要花費時間與精力的事情、也很沒有意義
討論完後一定有人不願意買單
新進人員的意見也無法傳達給做出決策卻早已離開的元老

每個人都有自己的偏好
為什麼我不能有我看得順眼的風格,雖然看起來獨特但不影響與他人友好協作呢

(如果連變數的英文命名、程式上的邏輯風格也能相同就更好了
嘛,但這是胡思亂想的、好像沒有辦法解決... 如果連演算法風格都能一致,那是很可怕的事)

希望有朝一日
工程師能暢快的帶著自己的Profile Setting到處趴趴走
到哪不論看什麼專案、到處看了什麼都舒服,因為都是自己習慣的風格
不用再記憶這些風格的眉眉角角,而是專注在眼前的邏輯與意境上

所以,希望未來有人能做出這樣完整的一套工具

不曉得現在有沒有團隊在思考類似的解決方案,或者已有什麼套件能達成?
或者這樣實際上可能會面臨、產生什麼問題嗎?

整理過往寫程式的體驗,拋出自己想法
期待這顆硬邦邦的磚頭引來讓大家思考與討論,激盪出更好的辦法

看更多先前的討論...收起先前的討論...
alien663 iT邦研究生 3 級 ‧ 2023-11-01 08:30:27 檢舉
eslint
Pythonist iT邦新手 4 級 ‧ 2023-11-01 09:27:12 檢舉
別的不說,原po文章的換行、標點符號看得真舒服
Hey iT邦新手 2 級 ‧ 2023-11-01 09:38:33 檢舉
每個人的style不同, 要是各人自己顧自己, 不想如何合作起來, 世界大亂是必然發生的
古有云分久必合合久必分
天下大亂是必然的,合作久了也是會分的XD
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
海綿寶寶
iT邦大神 1 級 ‧ 2023-11-03 19:46:44
最佳解答

建議您逛逛checkstyle.org
最好加入他們
應該可以和很多同好交換心得
/images/emoticon/emoticon77.gif

1
jojomango
iT邦見習生 ‧ 2023-11-02 12:42:30

我認為大家要想自己看了開心的風格, 在協作上就會有很多時間花在把別人的改成自己喜歡的風格
甚至當作貢獻的一部分

所以coding style需要團隊討論過同意某種規範, 最好是可以讓程式或設定的library來幫你處理, 像是很多IDE都可以自動化處理像是換行, indent, 空一行這種很規律的規則, 不同的程式語言應該都有常用的dev library來省掉這些工

我真的反對讓工程師在每次review時花時間在挑這些可以被機器檢查修正的事情上

1
耿直小伙
iT邦新手 1 級 ‧ 2023-11-02 13:36:12

coding style 本來就是公司、團隊自行約束定義,至於內文提到 a、b 工程師各寫各的排版,這也是沒約束的問題,以 js 來說就是使用 eslint 放在 project 內約束每個開發者 (開發者還硬要用自己的 ide 設定就該檢討),再來以公司為出發點的話,個人看得舒不舒服並不是重點,而是團隊能不能運作流暢、理解快速。

coding style 很主觀,且改變不可避免,因為人類跟語法糖都會進步,進步勢必帶來改變,與其奢望可以固定一套,不如改變心態跟上趨勢,或者自己創業,coding style 你說了算!

1
crazystarwang37
iT邦新手 5 級 ‧ 2023-11-02 13:43:09

要把寫好程式碼中的變數名稱, 在不同環境/情境下能自動變更 (例如 myVar 在環境A 變成 MyVar, 然後在情境B 變成 my_var) , 應該是滿難的. (出錯了應該很難 debug). 比較有可能實現的, 應該是格式的自動變換, 即程式碼 (資料) 不用變, 然後透過 viewer/render 來依指定 (手動或自動) 呈現不同的結果.

是說, 這概念在部份 IDE (例如 Visual Studio) 已經實現了, 只不過要手動指定 (例如, 要套用 Google 的 format, 還是微軟的 format. 當然, 也可以自訂); 然後變更過的呈現結果, 也會連動影響到原始資料 (程式碼).

1
Terry L.
iT邦研究生 3 級 ‧ 2023-11-05 00:20:46

JavaScript 生態系有很完整的工具,EsLint,StyleLint,配合 IDE 的擴充套件都是自動轉換,不需要特別 format 之後再上傳。

可以參考我寫的文章:程式碼品質工具:ESLint、StyleLint、Prettier

基本上在 CI 那邊就必須設定好規則,沒通過檢查就無法被 merge 。成員每一個人都使用相同的規則。

0
evawillms
iT邦見習生 ‧ 2023-12-08 08:51:42

是的,您可以个性化您的编码风格。 编码风格是开发人员在编写代码时使用的一组约定和规则,以确保代码一致且易于阅读。 每个开发人员都可以根据自己的喜好和需求定义自己的编码风格。Run 3 是一种实现个性化编码风格的方法。

0
priyanka00
iT邦見習生 ‧ 2024-03-21 14:49:21

If you are looking for a naughty date in Goa, then these naughty Escort Service in Goa are the perfect choice for you. They will make sure that you have an unforgettable experience and that your date is a night to remember.

我要發表回答

立即登入回答