iT邦幫忙

2021 iThome 鐵人賽

DAY 3
0

輸入處理,功能實現,輸出處理,異常處理。

鐵人賽第三天,/images/emoticon/emoticon08.gif
今天在進入對於方法的『 輸入處理 』前:

第一個問題是,

如果方法本身沒有實現任何功能,就沒有存在必要不是嗎?

答案:當然是正確

你會說這問題太好笑了吧,
不!這真的很重要!
因為我們目標是寫出簡潔大方的資優生程式碼,
故太多不必要的程式碼定義是非常佔據效能與空間的。

那故事說回來,

有哪些輸入的方法?

大部分方法都會有某種形式的輸入,例如直接輸入 與 間接輸入。

常用的直接輸入:

參數輸入:

def month_in_year(num_months)
    num_months * 12 * 30 
end   

類或模組中:

class MonthlyCalendar
    MONTH_IN_YEAR = 12 * 30 

    def month_in_year(num_months)
        num_months * MONTH_IN_YEAR
    end 
end 

實體變數:

class MonthlyCalendar
  def initialize
    @start_date = Time.now
  end
      
  def time_n_month_from_now(num_months)
    @start_date + num_months * 12 * 30 
  end 
end 

MonthlyCalendar.new.time_n_month_from_now(3)

第3行提出了一個特別的點,
這裡的 Time 被當成是類別『名』輸入而非常數、類別輸入。
原因是在 Ruby 中,類本身也是一種物件。而類名是一個普通的常數,
所以經過 initialize 定義了 Time 這個常數,Time 恰好被引用成一個類而已。
這也是一種特別形式的輸入。

常用的間接輸入:

舉例:

Time.now # 間接輸入

引用 Time 類,把 now 消息發送給 Time 。實際上所需要的是 now 的回傳值,而不是 Time 常數本身,這就是一種間接輸入。

還有種方法是沒有帶任何參數的 :

舉例:

def month_in_year
    12 * 30 # 定義一個計算一年天數的方法
end   

也等同於以下:

MONTH_IN_YEAR = 12 * 30 # 將方法替換成常數

常數就好比定義、定量。它設定好的內容通常就不太會去變更。
所以通常這種方法功能是有限的。

那有特殊情況嗎?

其實是有的,
這將在下章節再深入探討變化:

間接輸入只能有一層嗎?
間接輸入如果帶層次與程式碼的影響?
間接輸入後的程式碼與環境的改變?
(也可以未看先猜XDD )
(跟著我一起翻開 『 優雅的 Ruby 』 一書,一起飛揚研究吧 )

最後,為什麼要提出輸入探討?
『 優雅的 Ruby 』道出關鍵,

From Roles to Object (從角色到對象)

簡單來說,就是『 對的人,放在對的事,與對的時間點,才會事半功倍 』
同樣的,要寫出好的程式碼(清晰度ok、健康度ok)就得先從輸入下功夫。

從根本下手,為方法準備輸入時需思考:

1.可用的輸入與方法之間所需要的角色如何建立關聯。
2.輸入處理的方法,以及本身可以容納多少類別、與如何協調。

讀完這篇章,翻翻曾經寫過的 Code ,
仔細閱讀曾經定義方法的地方與上述思考方式做結合,
再重新用自己的話去描述寫出來的程式碼進行表達,
會發現對於寫出資優生筆記的道路上,又再度往前一腳步了!

穩紮穩打才是基礎!一起加油!


上一篇
歸納的方法
下一篇
『 間接方法 』
系列文
寫出優雅的 Ruby ! (衡量自我學習時間,轉為雞湯系列再出發! )4
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言