# How do you organize your code? (module pattern, classical inheritance?)
> 我以前使用 Backbone 組織我的模型(model),Backbone 鼓勵採用面向對象的方法——創建 Backbone 模型,並為其添加方法。
> 模塊模式仍然是很好的方式,但是現在我使用基於 React/Redux 的 Flux 體系結構,它鼓勵使用單向函數編程的方法。我用普通對象(plain object)表示我的 app 模型,編寫實用純函數去操作這些對象。使用動作(actions)和化簡器(reducers)來處理狀態,就像其他 Redux 應用一樣。
> 我盡可能避免使用經典繼承。如果非要這麼做,我會堅持這些原則。
#### Backbone 是什麼?
Backbone是一個實現了web前端mvc模式的輕量級js框架,發佈於2010年,Backbone依賴underscore.js,jQuery搭配做使用。但它其實不是以大家所知的的(MVC) Model-View-Controller 這樣的模式,而是Model-Collection-View 這三類物件,利用event進行串連的方式。
主要的組件:
Model 資料模型(核心),
View (檢視,Model的改動在前端反應),
Collection (模型集合),
Router(路由器,對應hash值),
History (開啟歷史管理)
Backbone Model 與 View的範例:
```*
<html xmlns="http://www.w3.org/1999/xhtml">
<title>Design2U</title>
<!--import library-->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="http://documentcloud.github.com/underscore/underscore-min.js"></script>
<script type="text/javascript" src="http://documentcloud.github.com/backbone/backbone-min.js"></script>
<script type="text/javascript">
//Backbone Model
var user = new Backbone.Model({
firstName: "Jack",
lastName: "divaka"
});
// print model result
alert(JSON.stringify(user));
//Backbone View
var View = Backbone.View.extend({
// 初始化 View
initialize:function(){
alert("the view has been rendered");
// get the model data
document.write(this.model.get("firstName"));
document.write("│");
document.write(this.model.get("lastName"));
}
});
// 宣告一個 view 的 instance
var viewInstance = new View({ model: user });
</script>
```
[線上操作連結](http://jsfiddle.net/t3qzg8L1/5/)
> Backbone最適合的場景:Backbone.js適合用在小型SPA專案,需要用JS生成大量的頁面內容
### 現在會使用React/Redux,基於 Flux 架構的單向數據流。。
什麼是 Flux?
Flux 是 Facebook 內部搭配 React 使用的一種架構,一種設計模式,提供單向資料流的概念 (Unidirectional Data Flow)。
這一連串的步驟會匯整為一個資料流(Data Flow),Flux用 單向(unidirectional) 資料流來設計整個資料流的運作,也就是說整個資料的 流動方向 都是一致的:

### 補充: 避免使用 classical inheritance
ES6中的Class(類別)一些廣泛的討論與使用建議。
Class(類別)是一個全新的語法,但它的目前整體的內容,如果與Java、C++這些語言相比,還顯得粗糙與簡單,目前也沒什麼發展出什麼設計模式。
在ES6中的Class(類別)語法,並不是真的是以類別為基礎(class-based)的物件導向,在骨子裡仍然是以原型為基礎(prototype-based)的物件導向,它只是個語法糖(syntactical sugar)。加入Class(類別)語法的目的,並不是要建立另一套物件導向的繼承模型,而是為了提供更簡潔的語法來作物件建立與繼承,當然,一部份的原因是,讓已經熟悉以類別為基礎的物件導向程式語言的開發者使用,以此提供另一種在物件導向語法上的選擇。
:::danger
Class 只是簡化了 JavaScript 中操作 Constructor 的語法糖而已。
:::
#### 為什麼要避免使用classical inheritance?
1. class繼承掩蓋了JS的核心是原型繼承。
2. class鼓勵繼承,但應該要更喜歡composition。
3. class往往會將你鎖定在你想出的第一個糟糕的設計中。
那該如何更好的使用class inheritance?
* 拒絕讓class成為你的公共 API。
* 不要繼承超過一次
* 不要在methoda中呼叫super
* 別期望別人使用你的類別
* 學習functional programming
參考文章:
[[Javascript] Backbone.js (一) Hello backbone](https://ithelp.ithome.com.tw/articles/10095695)
[Backbone入門講解]([Backbone入門講解/](https://www.itread01.com/content/1546521328.html))
[講解JavaScript的Backbone.js框架的MVC結構設計理念](https://codertw.com/%E5%89%8D%E7%AB%AF%E9%96%8B%E7%99%BC/270094/)
[Top 25 Backbone.js Interview Questions & Answers (2021)
](https://career.guru99.com/top-25-backbone-js-interview-questions/)
[從「鄙視 jQuery」聊起 -技術鄙視從何而來?](https://blog.darkthread.net/blog/jquery-dispise/)
[Best Frontend Frameworks of 2021 for Web Development
](https://blog.devgenius.io/best-frontend-frameworks-of-2021-for-web-development-7a183652d81b)
[How to Use Classes and Sleep at Night](https://medium.com/@dan_abramov/how-to-use-classes-and-sleep-at-night-9af8de78ccb4)
[Day 10: ES6篇 - Class(類別)](https://ithelp.ithome.com.tw/articles/10185583)
[JavaScript | ES6 中最容易誤會的語法糖 Class - 基本用法](https://medium.com/enjoy-life-enjoy-coding/javascript-es6-%E4%B8%AD%E6%9C%80%E5%AE%B9%E6%98%93%E8%AA%A4%E6%9C%83%E7%9A%84%E8%AA%9E%E6%B3%95%E7%B3%96-class-%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95-23e4a4a5e8ed)
2021年stackoverflow五月调查統計:
[2021 Developer Survey](https://insights.stackoverflow.com/survey/2021#most-popular-technologies-webframe-prof)
[The Two Pillars of JavaScript](https://medium.com/javascript-scene/the-two-pillars-of-javascript-ee6f3281e7f3)
[请停止将JavaScript类型化(建议不要使用class实现类继承](http://ourjs.com/detail/55b5a17afbd23139de9e354c)