Javascript new with apply

  js 函式可以透過一些方式與公用函式來動態呼叫,並用陣列動態丟入參數,但是透過公用函式可以呼叫參數那不就失去能力動態呼叫 new 建構子了嗎?因為語法上有衝突~如同下面範例,第二行,這樣就已經變成呼叫函式了,如果變換一下用第三種方式呼叫,乍看好像結果會一樣,但是如果建構子內有修改全域變數可能會造成一些後遺症,那要如何用陣列丟參數的情況下產生物件勒勒勒~~

  // call function by array
  func.apply(this, [1, 2]);
  // new object by array ?
  new func.apply(this, [1, 2]);
  // maybe has side effect .. because the func be called twice.
  func.apply(new func(), [1, 2]);

Continue reading…

OCP(Open-Closed Principle)

敏捷軟體開發:開放封閉守則

要對擴充保持開放,對修改保持封閉。

要假設你所設計出來的系統,是可以額外增加程式碼來擴充系統時常變更的功能。而且假設你的程式不能被更改。

就像設計一個函式庫,不能假設使用者要來修改妳的函式庫的原始碼,這樣會造成程式來源不一,版本變更後不相容的情況。

但要對某項時常變更的部份保持開放,例如 排序 的函式庫,通常都會開放「比較的實作」,因為他時常會變更,你可以自己寫一個比較的函式然後當成參數傳進去排序演算法,來讓排序演算法的核心行為改變。

為什麼要當參數傳呢?因為:

  1. 讓此函式有擴充的彈性。
  2. 不可以修改排序演算法已經寫好的結構與原始碼。

Web

在設計 Web 的系統時,通常要先瞭解這個系統需要變更的地方在哪裡,然後替這些地方寫成可以擴充,例如一個內容管理系統,以 drupal 為例,他的核心就是頁面,每一個頁面可以視為一個 node ,而他需要擴充的地方在 node 的形式,node 最基本可能是一個文章,也可以被擴充成相簿、相片、投票、留言版,這就是內容管理系統需要被擴充的地方。

所以要把他寫成,基於 node 以後,我可以自己寫一些程式來改變 node 的管理介面,顯示介面。來讓整個 node 被擴充成完全不一樣的形式,又或許可以在現有的所有 node 的生命週期上設計一個 hook 來改變 node 的行為。

例如可以掛 php 或 js ,掛 js 是很 powerful 的,你只要隨便在一個頁面上掛載你的 js 你幾乎可以做任何的事,但…能力越大責任越大,這個彈性會讓你因此而需要確保每個頁面的行為不會因此被你影響到,需要做很多的檢查來確保你在每頁所做的事都不會影響到其他程式。因此最好要有一個類似沙盒的環境來跑這隻 js 限制他所能做的事,來確保不會被某隻兔崽子把牆壁弄破…,整個房子都進水。阿 颱風要來了………