Blog Cover Image

Inspire you to have New thinking, Walk out your unique Road.

有的時候,你無意間遇到的一些故事,會激發你的靈感,改變你的想法,接下來你會用與之前全然不同的觀念去創造屬於你獨特的故事。

Sign @MinaYu.

[後端小菜鳥]初階工程師魔鬼訓練(4) - 重構Refactoring / Input&Output

Posted on

如何突破新手階段中,好像沒有太深刻提到重構的部分

在被列為初階工程師應學的幾個項目中,重構是其中一項 搭配單元測試,能將發揮出高效率低Bug的產出

在這篇稍微筆記一下重構,順便想講一下Input/Output

在新手時期,我們習慣將程式一次性從頭寫到尾

習慣for迴圈包for迴圈

但這往往在除錯的時候造成作業困難

列一下重構的解釋 重構 Refactoring

重構為敏捷開發方法之一

指的是將原先寫的程式碼在不影響輸出的情況下做簡化,增加可讀性

這麼一來萬一出Bugs, 也比較好Debug,尤其是當你面對上萬條程式碼時

打個比方,假設我要連接db insert 五筆資料

一部分的程式碼開始會是這樣寫

engine = ...
connection = engine.connect()
engine.execute("INSERT INTO User(User,Email) VALUES ('Amy', 'Amy@123')")
connection.close()

如果要五筆資料那就

engine = ...
connection = engine.connect()
engine.execute("INSERT INTO User(User,Email) VALUES ('Amy', 'Amy@123')")
engine.execute("INSERT INTO User(User,Email) VALUES ('Amy', 'Amy@123')")
engine.execute("INSERT INTO User(User,Email) VALUES ('Amy', 'Amy@123')")
engine.execute("INSERT INTO User(User,Email) VALUES ('Amy', 'Amy@123')")
engine.execute("INSERT INTO User(User,Email) VALUES ('Amy', 'Amy@123')")
connection.close()

可是如果要五筆不同的資料呢?

engine = ...
connection = engine.connect()
engine.execute("INSERT INTO User(User,Email) VALUES ('Amy', 'Amy@123')")
engine.execute("INSERT INTO User(User,Email) VALUES ('Jason', 'Jason@123')")
engine.execute("INSERT INTO User(User,Email) VALUES ('Koff', 'Koff@123')")
engine.execute("INSERT INTO User(User,Email) VALUES ('Annie', 'Annie@123')")
engine.execute("INSERT INTO User(User,Email) VALUES ('Bob', 'Bob@123')")
connection.close()

複製五筆改一下就好,可是我就被罵了xDDDD

後來我改了程式碼

def insert_data():
    sql = "INSERT INTO User(User,Email) VALUES "
    engine.execute("{sql}('{user}', '{email}')".format(sql=sql, user=user, email=email))

def connection():
    engine = ...
    connection = engine.connect()
    insert_data()
    connection.close()

user_list = [Amy, Koff, Jason, Bob, Cathy]
for i in user_list:
    user = i
    email = "..."
    connection()

我不知道這樣寫會不會work,不過範例是這樣

這還是蠻淺的部分

未來要是遇到更多更複雜的程式碼

「硬幹」不會是一個好方法,「硬寫」也不會

除了讓程式碼可讀性降低,容易出錯外,抓錯也很難抓

雖然現在手邊沒有比較好的例子

假設你寫了迴圈包迴圈,再加If/Else 的語法

亦或者寫的程式複雜度比這個更好

將你寫的程式做重構整理會比較好

雖然我現在也還是在很幼幼的階級,但會秉持著兩個原則去更改我的程式

  1. 不要寫重複的程式碼,若會有需重複作業的,看能不能抽出去為一個函式做共用功能

  2. 看到看起來覺得不好看的程式碼,就思考一下有沒有其他方法能好看點

剛進公司的時候我寫的程式碼也是很難看,也是經過很多練習到現在才”稍微“好一點


再來是** Input/ Output**

這部分分為兩個

  1. 當自己覺得很頭痛不知道該怎麼寫功能時

  2. 當後端與前端或其他做溝通/連接時

在寫程式的時候,會遇到很多次不知所措

前輩會跟我說,當你遇到開發一個新功能時,你只要關心程式的Input/ Output

也就是說,你會送怎樣形式的資料進程式,還有經過你寫的程式後,輸出的資料會長怎麼樣

若輸進(Input) 的指令是一個代碼(假設225),輸出(Output)得是對應到225的dataframe

輸進輸出都定好了,接下來的工作就是如何將225跟225的dataframe串起並輸出

然後就分細節去撰寫了


再來就是前端跟後端在溝通時,所使用的格式

通常前端跟後端使用的語言會不同,所以他們溝通的形式就是Json(或其他)

所以在寫程式的時候,後端要注意前端傳進什麼資料(Input),並注意前端要什麼資料(Output)

前端也是注意後端傳進什麼資料(Input),要做什麼功能(Output)

只要輸入輸出是對的,通常程式都是可以Work,至於其他的細節又是別的事了

只是說當需要開發新功能,或不知道程式怎麼做的時候:

  • 先定好輸入輸出的規格

  • 根據如何將輸入變成輸出做程式規劃

  • 拆解程式細節並一一做撰寫

這篇先分享到這,有更新在後續做修改囉