ADZ 學習筆記

Ruby/Rails, Startup, Life

rails 筆記 - php vs ruby 寫法差異

| Comments

語言特性

最近在教一些原本寫 php 的人寫 rails,發現寫 rails 優雅有很大是 ruby 語言/物件特性的功勞,以 php 的 method 設計的例子來說:

model
class Orders extends Table_Abstract {
  public function calculate_total_amount() {
    // heavy calculation
  }
}

在 php 通常使用上都會先拿一個變數,先把 calculate_total_amount 的結果存起來,再去做其他事情,導致定義了一堆 block variables 來暫存跑出來的結果。

即使試圖把 calculate_total_amount result 自己 cache 起來,但在 php 的 instance 在內部使用上還是要用 $this-> 來呼叫,這樣多寫那麼多行 code 並沒有乾淨到哪去,而既然 cache method 並不會讓 code 變乾淨,當然這種寫法在 php 就沒那麼流行。

另一點是既然 method cache 不流行,又怕把 method 命名成 total_amount 會被誤以為是很 light 的 method 而被其他人重複大量使用,最後導致 php 的命名要包含更多 details。

反觀 ruby 不需要先行宣告 instance variables、呼叫 instance 內部 method 也不強制 receiver 這些特點,反而讓 method cache 變得很方便又很 clean,命名也可以不囉唆的切入重點:

lib/spin/profit_calculator.rb
class ProfitCalculator
  # ... (略)


  def dispatched_amount_max
    @dispatched_amount_max ||= begin
      # .... very heavy calculation

    end
  end

  def dispatched_amount
    @dispatched_amount ||= if dispatched_amount_max > 0
      dispatched_amount_max * rand(0..max_rate)
    else
      current_profit
    end
  end

  def max_rate
    @max_rate ||= # .... very heavy calculation

  end
  
  def current_profit
    @current_profit ||= # .... very heavy calculation

  end
end

正規化 & 單一 API 入口

另外觀察到 rails 提供的 API 有花一些功夫做 normalization 的處理,例如: controller render redirect_to,view helper render link_to,單一化入口讓感覺上你只需要學習一個 API 而不需要從一堆 method 中找一個適合自己的來用,然後也不知道自己找到的是不是最好的方法。

這種設計的好處除了有 好學的假像之外,用起來很 high level 讀起來不會失去耐性,只能說開發 rails 的人真的很強。然後剛剛看了 zend framework 做一個 redirect + flash message 的程式碼 ....

controller
$flashMessenger = $this->_helper->getHelper('FlashMessenger');
$flashMessenger->addMessage('We did something in the last request');
$this->_helper->_redirector('/');

OMG

Comments

comments powered by Disqus