工程程式碼不簡單

  • 2019 年 10 月 25 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/tkokof1/article/details/102732154

本文簡述了一些自己對於工程程式碼的認識

經歷了多年的開發之後,有些一開始顯得高大上的話題,因為遇到的次數多了,慢慢的也變的平常起來,而平常的事物往往又會給人簡單的感覺,於是那些原本高大上的話題,漸漸的也變的"簡單"起來…

但很多時候,我們只是熟稔了這些話題的基本概念,所謂的"簡單"只是一種錯覺罷了,尤其是從工程角度考慮更是如此.

簡單舉個例子:

Observer Pattern(觀察者模式)

剛接觸觀察者模式(或者說設計模式)的時候,總會讓人產生些高大上的感覺,不過見的次數一多,大家也都自然而然的覺得簡單起來了,熟悉的朋友甚至都可以隨手寫份實現:

-- observer_manager.lua  local table = table  local observers = {}  local observer_manager = {}    -- add observer  function observer_manager.add(observer)      table.insert(observers, observer)  end    -- remove observer  function observer_manager.remove(observer)      for i = 1, #observers do          if observers[i] == observer then              table.remove(observers, i)              break          end      end  end    -- clear observers  function observer_manager.clear()      observers = {}  end    -- notify observers  function observer_manager.notify(event)      for i = 1, #observers do          observers[i].on(event)      end  end    return observer_manager

簡單測試一下,運行的結果也很正確:

local observer_manager = require("observer_manager")    local observer_1 = { on = function(event) print("observer_1 on " .. event) end }  local observer_2 = { on = function(event) print("observer_2 on " .. event) end }    observer_manager.add(observer_1)  observer_manager.add(observer_2)  observer_manager.notify("event_1")    observer_manager.remove(observer_1)  observer_manager.notify("event_2")    observer_manager.clear()  observer_manager.notify("event_3")    observer_manager.add(observer_1)  observer_manager.add(observer_2)  observer_manager.notify("event_4")    --------    // output:    observer_1 on event_1  observer_2 on event_1  observer_2 on event_2  observer_1 on event_4  observer_2 on event_4

看起來實現觀察者模式真的是比較簡單,如果工程中需要使用觀察者模式的話,是不是我們直接將上述程式碼添加進項目就可以了呢?

答案是否定的,因為在工程程式碼中,你不僅僅要實現觀察者模式的基本概念,你還要權衡是否需要實現一些觀察者模式的衍生概念,另外更多的是,你還要處理好很多實現相關的邊界問題.

隨便列些問題(以上述的簡單實現程式碼為例):

  • 重複的 add observer 怎麼處理?
  • 重複的 remove observer 怎麼處理?
  • 如果在 notify 過程中 add observer 怎麼處理?
  • 如果在 notify 過程中 remove observer 怎麼處理?
  • notify 過程中,調用 observer 回調的順序是否需要定義?
  • observer 是否需要調整自己的回調順序?
  • 如果需要, observer 怎樣調整自己的回調順序?
  • 如果需要, observer 的回調順序調整機制應該如何實現?
  • observer 的回調中出現錯誤怎麼處理?
  • observer 的回調中出現超時怎麼處理?

看到這裡,我想你應該不會覺得在工程中實現一個觀察者模式是件簡單的事情了…

總結

很多話題的核心概念並不複雜,簡單的程式碼實現也並不困難,但是要在工程項目中進行實現則是另外一回事了,問題在於在工程項目中,你不僅僅要實現基本概念,還要權衡實現衍生概念,另外更多的你還要處理好很多實現相關的邊界問題.

總的來說,工程程式碼不簡單.