幫之前的應用程式加上了一些controller
2012年11月30日 星期五
2012年11月27日 星期二
javascript is a(an) OO language?
推薦一本書,javascript patterns
http://shop.oreilly.com/product/9780596806767.do
不少專案在研究javascript如何實作繼承(inheritance)這件事情,者本書的第六章專門討論這個章節,有興趣的人也可以跑去研究coffeescript如何實做這件事情
我思考了這個議題的後續發展multiple inheritance三天,終於了解到了他跟類似C++/Java發展的差異性
看backbone.js跟prototye lib的時候,我一直懷疑,為何要包裝成這樣,感覺不如使用javascript來的直觀,效能稍微也比較差一點,但是仔細想想後,他們都有他們的道理,只能說用javascript來實作C++/Java的語意,實在有一定的難度
我得到的東西
整體可以看出,javascript在彈性上面很方便,可是如果要實作多重繼承則是非常吃力,code reuse無法如C++/Java容易,反倒是用另外一種觀點(duck typing),反而來的輕鬆,這樣來說算不算OO呢?我覺得是見仁見智囉
http://shop.oreilly.com/product/9780596806767.do
不少專案在研究javascript如何實作繼承(inheritance)這件事情,者本書的第六章專門討論這個章節,有興趣的人也可以跑去研究coffeescript如何實做這件事情
我思考了這個議題的後續發展multiple inheritance三天,終於了解到了他跟類似C++/Java發展的差異性
看backbone.js跟prototye lib的時候,我一直懷疑,為何要包裝成這樣,感覺不如使用javascript來的直觀,效能稍微也比較差一點,但是仔細想想後,他們都有他們的道理,只能說用javascript來實作C++/Java的語意,實在有一定的難度
我得到的東西
- javascript prototype, property生成的方式
- C++/Java在多重繼承上面的考量,在multiple-interface跟multiple-inheritance的實作上的差異
- javascript如何實作多重繼承(我自己弄了一個,就不野人獻曝了)
整體可以看出,javascript在彈性上面很方便,可是如果要實作多重繼承則是非常吃力,code reuse無法如C++/Java容易,反倒是用另外一種觀點(duck typing),反而來的輕鬆,這樣來說算不算OO呢?我覺得是見仁見智囉
2012年11月19日 星期一
Javascript is OOP?
這是個會引發"聖戰"之類的話題,我想這件事情留給有能力的人去回答,退而在此討論javascript"做得到"跟"做不到"的事情
is-a關係,很多人第一刻在繼承裡面學到的。我們說objC is a objP,也就是說可以把objC當成objP一樣對待,兒子應該跟老爸有相同的四肢構造。
可以先看底下的文章,解釋如何使用javascript的prototype完成繼承
http://peter.michaux.ca/articles/transitioning-from-java-classes-to-javascript-prototypes
首先要解釋的是javascript是duck type的程式語言,很多程式語言都是duck type,也就是一個物件看起來像是鴨子(特徵attributes),走路像鴨子(methods),那麼我們就認定他是一隻鴨子
javascript藉由prototype,隨時隨地可以將一個物件的屬性跟介面加入另外一個物件裡面,讓一個物件看起來像是另外一類的物件,比方說在上面peter給的範例實作了observer pattern,如果今天我有個物件擁有update方法,那我就看起來像是observer,真的是這樣嗎?所以要預防這種事情,絕對的方式是用instanceof來檢驗update方法真的來自observer。第二個問題,跟著如果併入另外一組物件的屬性跟介面(也有update)的時候,兩個function A跟B想要的是不同型態的參數,這時候呼叫的是哪一個update??似乎兩者都可以互通,這是duck type的特性
is-a關係,很多人第一刻在繼承裡面學到的。我們說objC is a objP,也就是說可以把objC當成objP一樣對待,兒子應該跟老爸有相同的四肢構造。
可以先看底下的文章,解釋如何使用javascript的prototype完成繼承
http://peter.michaux.ca/articles/transitioning-from-java-classes-to-javascript-prototypes
首先要解釋的是javascript是duck type的程式語言,很多程式語言都是duck type,也就是一個物件看起來像是鴨子(特徵attributes),走路像鴨子(methods),那麼我們就認定他是一隻鴨子
javascript藉由prototype,隨時隨地可以將一個物件的屬性跟介面加入另外一個物件裡面,讓一個物件看起來像是另外一類的物件,比方說在上面peter給的範例實作了observer pattern,如果今天我有個物件擁有update方法,那我就看起來像是observer,真的是這樣嗎?所以要預防這種事情,絕對的方式是用instanceof來檢驗update方法真的來自observer。第二個問題,跟著如果併入另外一組物件的屬性跟介面(也有update)的時候,兩個function A跟B想要的是不同型態的參數,這時候呼叫的是哪一個update??似乎兩者都可以互通,這是duck type的特性
extends(WeatherModel, Observable);
extends(WeatherModel, Observable2);<=????????????????
function A(o:Observable);<=????????????????
function B(o:Observable2);<=????????????????
可以預期的是上面的程式碼可以順利運作(一定會呼叫某個物件的update,或者某個型態的update),但是未必如你所料
回頭來看java/C++,如果今天要在程式執行期間的實作一組介面,恐怕沒有辦法,你只能期待能不能從java Reflection或者C++的pointer跟強制轉型,擠出一點希望,但反過來說,是你可以確定的是不會讓一個不該屬於某個介面的物件放進一個不應該屬於那個型態的function之內(compile time)
OO上很重的一個觀念是is-a的體現,但兩者不同的做法沒有絕對的好壞,因為OO上is-a的解釋很寬廣。從上面可以看出來java/C++是strong type,所以在這種事情上給了某種保證,但是也失去了彈性,javascript獲取了彈性(duck type),但是也付出了某種代價。
OO的體現差異,上面提到的只是兩者之間在OO方面實作差異的冰山一角,希望能對大家在OO上面有進一步的體驗。
Peter的文章告訴我們不要從語言上面學習OO是個很重要的觀念,同時了解語言的差異在體現OO的特性上也很有幫助。對於學習OO觀念,或許從CRC卡上著手是個不錯的開始
可是也別太過極端,認為任何程式語言都可以實作OO,那恐怕是程度上的區別。不要被程式語言綁架了體現OO的作法,但一個程式語言號稱是OOP亦有他的道理
P.S. 網路上爬了一堆號稱javascript繼承實作的方式(甚至多重繼承),請仔細檢驗,是否能夠達成呼叫super class的constructor?是否能使用super class的variable?這往往跟我們直覺不大一樣,一旦在sub class/instance 呼叫了super class的method,其中帶有super class的variable,很快地會看到interpreter跟你抱怨,那個method不是一個function(奇怪吧!)
比方說下面這個網址的實作,至少就犯了兩三個錯誤
www.amirharel.com/2010/06/11/implementing-multiple-inheritance-in-javascript/
下面是一個例子,討論串中有它的問題
http://www.steinbit.org/words/programming/multiple-inheritance-in-javascript
回頭來看java/C++,如果今天要在程式執行期間的實作一組介面,恐怕沒有辦法,你只能期待能不能從java Reflection或者C++的pointer跟強制轉型,擠出一點希望,但反過來說,是你可以確定的是不會讓一個不該屬於某個介面的物件放進一個不應該屬於那個型態的function之內(compile time)
OO上很重的一個觀念是is-a的體現,但兩者不同的做法沒有絕對的好壞,因為OO上is-a的解釋很寬廣。從上面可以看出來java/C++是strong type,所以在這種事情上給了某種保證,但是也失去了彈性,javascript獲取了彈性(duck type),但是也付出了某種代價。
OO的體現差異,上面提到的只是兩者之間在OO方面實作差異的冰山一角,希望能對大家在OO上面有進一步的體驗。
Peter的文章告訴我們不要從語言上面學習OO是個很重要的觀念,同時了解語言的差異在體現OO的特性上也很有幫助。對於學習OO觀念,或許從CRC卡上著手是個不錯的開始
可是也別太過極端,認為任何程式語言都可以實作OO,那恐怕是程度上的區別。不要被程式語言綁架了體現OO的作法,但一個程式語言號稱是OOP亦有他的道理
P.S. 網路上爬了一堆號稱javascript繼承實作的方式(甚至多重繼承),請仔細檢驗,是否能夠達成呼叫super class的constructor?是否能使用super class的variable?這往往跟我們直覺不大一樣,一旦在sub class/instance 呼叫了super class的method,其中帶有super class的variable,很快地會看到interpreter跟你抱怨,那個method不是一個function(奇怪吧!)
比方說下面這個網址的實作,至少就犯了兩三個錯誤
www.amirharel.com/2010/06/11/implementing-multiple-inheritance-in-javascript/
下面是一個例子,討論串中有它的問題
http://www.steinbit.org/words/programming/multiple-inheritance-in-javascript
2012年11月18日 星期日
KML and google map
下雨天,好憂鬱的天氣,百般無聊下,整理舊的硬碟資料,想不到看到以前的kmz檔案,想說打開軟體看一下,結果一開,掛點 orz,想說那就自己來寫吧
就拿起一本之前借來的google map書籍,想來個依樣畫葫蘆,體驗一下google map的威力,結果一查資料,才發現原來...是已經過期了,才一年多前的資料,竟然google map已經從v2搬移到v3,一堆寫法都改變了,傷腦筋!! P.S.看來這也是GPS logger附贈軟體無法運作的原因,因為api改了,這軟體應該是內嵌一個瀏覽器做map的偽裝
已經超過六七年沒寫過javascript了,好吧,接著就是開始跟ajax, jquery, google map, flot裝熟,花了兩天大致上把一些功能寫出來
基本上完成的圖案類似下面
經過一番研究,終於可以把圖表直接整合到google map上
接下來只要把kml上傳跟管理的功能整合應該就差不多,如果可以應該再來個動畫效果會更精采
直接來個demo影片吧^.^"野人獻曝了
就拿起一本之前借來的google map書籍,想來個依樣畫葫蘆,體驗一下google map的威力,結果一查資料,才發現原來...是已經過期了,才一年多前的資料,竟然google map已經從v2搬移到v3,一堆寫法都改變了,傷腦筋!! P.S.看來這也是GPS logger附贈軟體無法運作的原因,因為api改了,這軟體應該是內嵌一個瀏覽器做map的偽裝
已經超過六七年沒寫過javascript了,好吧,接著就是開始跟ajax, jquery, google map, flot裝熟,花了兩天大致上把一些功能寫出來
- 要能載入kml (google map搞定)
- 要能顯示速度跟高度(要parse kml,用flot畫圖)
- 要能依照速度資料點顯示位置(在google map上加上marker跟監控flot的onplothover事件)
基本上完成的圖案類似下面
經過一番研究,終於可以把圖表直接整合到google map上
接下來只要把kml上傳跟管理的功能整合應該就差不多,如果可以應該再來個動畫效果會更精采
直接來個demo影片吧^.^"野人獻曝了
2012年11月8日 星期四
eclipse -- plug-in directory
舊版的eclipse(<3.4)通常把plug-in直接拷貝到eclipse root directory底下的features或者plugins就可以,可是會顯得相當雜亂
在3.4之後導入了P2(Provision Platform),plug-in被安置到eclipse root directory底下的dropins目錄內了,如果是JAR只要直接放到dropins底價即可,但是如果是跟eclipse功能相關的plug-ins則是放在dropins/eclipse底下的features&plugins目錄底下
在3.4之後導入了P2(Provision Platform),plug-in被安置到eclipse root directory底下的dropins目錄內了,如果是JAR只要直接放到dropins底價即可,但是如果是跟eclipse功能相關的plug-ins則是放在dropins/eclipse底下的features&plugins目錄底下
eclipse -- JRE selection
年代久了,就會有不同的java版本開發的應用程式要維護,就必須選擇相對應的JRE,eclipse可以在[window]->[preference]->[Installed JREs]裡面統一管理JRE
可以在各個專案上,按下滑鼠右鍵,然後選擇[Run as]->[Configurations]內去設定想要的JRE
eclipse -- Tasks
Tasks是指那些用註解寫在檔案內要使用的的東西,預設會使用TODO跟FIXME開頭的註解當作task,後面的註解用來描述要提示的內容,可以打開task view就可以看到需要完成的tasks
同樣的還可以自訂標籤[window]->[preference]->[java]->[compiler]->[Task Tag]
這裡要注意的是tasks跟右邊的Mylyn所主導的Task list是不一樣的,Task list比較偏向專案的工作項目,而非軟體內要注意跟改善的地方
同樣的還可以自訂標籤[window]->[preference]->[java]->[compiler]->[Task Tag]
這裡要注意的是tasks跟右邊的Mylyn所主導的Task list是不一樣的,Task list比較偏向專案的工作項目,而非軟體內要注意跟改善的地方
訂閱:
文章 (Atom)







