2010年1月11日 星期一

ExtJS應用程式設計原則


取自http://blog.joomla.org.tw/javascript/53-extjs/71-extjs-application-design-1.html

作者是 EddyChang

這篇文章是從ExtJS官網討論區中找到的,非常值得參考,原來的問題是:「application design, component creation and efficiency」。由我個人的觀點來看,Javascript發展至今,仍然是百家爭鳴的時代,有非常多不同的framework或pattern,也很難和各式的應用能完全配合,ExtJS算是非常豐富的Javascript架構,但還是要配合像PHP的Server端程式才能完成整個應用程式。以下是關於Saki(ExtJS官方支援小組)的經驗回答摘譯:

使用以下的規則在開發Ext大型的應用程式上:
  1. 盡可能地多使用緩慢實例化(xtype)  - Use lazy instantiation (xtype) as much as possible.
  2. 使用預先設定好的類別 - Use pre-configured classes (I'll explain later).
  3. 在父階層中實作關係  - Implement relations on parent level.
  4. 在開發時,保持每個類別在自己的一個檔案;在產品化時,再組合和壓縮它們  - Keep each class in its own file while developing, concat and minify for production.

1. 盡可能地多使用緩慢實例化(xtype)

這點是如果你使用xtypes的話,Ext物件只有當他們需要時才會被建立。

備註:xtype和延伸類別的分離方式,的確是對大型開發有幫助。但關於上面的說明,在討論區的另一篇:「Does xtype really support lazy instantiation?」提出了lazy instantiation的質疑,以及和lazy redener的比較。


2. 使用預先設定好的類別

上述第1點的xtype的方法要配合預先設定好的類別"pre-configured classes",這些類別是擴充自Ext的類別而來的,帶有設定選項和(或)加入的函式。

備註:有許多範例可以了解怎麼寫出預先設定好的擴充類別,例如以下的: 3.在父階層中實作關係

想像你有一個border版面中,在西(左)邊有一個表格和中間有一個表單,當選了表格中的某個項目時,表單中要顯示對應的值。那到底要怎麼寫這段程式邏輯,是放在表格裡,還是表單裡?應該都不是這兩個。這兩者互不知道對方存在,知道這兩者同時存在的是它們的父階層(可能是viewpoint或window)

因此,關係會建立在父階層裡,例如window中。這裡的程式會是監聽表格來的事件,然後在選擇改變時載入表單資料,或是當表單進出資料後,改變表格的記錄。

如果我把程式碼寫在表格裡,那這個表格就和表單不可分離了。

備註:的確是很好的原則,不過直接的想法都是寫到事件發動處,在小型的事件處理,這樣比較快而且直觀。Saki在它的範例網站中,有加了兩個範例,這兩個範例都是很好的學習資源: 4.在開發時,保持每個類別在自己的一個檔案;在產品化時,再組合和壓縮它們

心得:ExtJS原本的作法就是如此,Linux下可以用Cat指令,Windows下可用ConCat/Split的軟體來合併Javascript檔案,再利用JSBuilder之類的工具,可以去除註解檔和壓縮檔案。

最後的忠告
不需要太深思熟慮於程式的結構、版面、各種控制器、載入器、介面…太多了。而是要寫出好的可重覆利用的預先設定好的類別,然後把它們不管如何先放到一起。如果這些類別真的是不錯而且可以重覆使用的,你大可以更改你的應用程式版本,使用別的方式來作,但你的類別至少仍然都會正常工作。就像是樂高積木一樣-如果你有木塊,你可以在幾分鐘內建出一個城堡。

心得:的確是如此。預先設定好的類別是必學的一段,雖然我有看過另一種寫法 - Module Pattern,Module Pattern是通用於各Javascript框架的寫法,或許也是一個值得一學的部份。在官方討論區中的「preconfigured class vs. module pattern」一文中有一些比較資訊可以參考。


2010年1月7日 星期四

Jesse Livermore語錄(1)


"There is nothing new in Wall Street. There can't be because speculation is as old as the hills. Whatever happens in the stock market today has happened before and will happen again."
華爾街未曾改變,財富來來去去,股票起起落落,但華爾街永遠沒變,因為人性永遠不會改變。
相信大家從去年的3955到去年的最後一天8188有著很深的感觸吧,當跌到谷底的時候,即便你想再跌也差不多了,就是不敢進去,到了年底,想說再漲應該也有限了吧(即便上萬,也只剩不到2000點),但是,在3955的時候,每個人心中只有恐懼,敢買的人有限,敢一口氣抱到年底的更是少數(電子股很多都漲超過5倍了),到了年底,8188之上,每個人的貪婪與無知,將自己推往股市,人性真的沒變過阿。
不斷的重複著貪婪、恐懼、無知、希望,所以市場重複著相同的結構與步驟,這一切的一切都是源自於人性

每個人都知道低買高賣,但是殺到後來你敢買嗎?
每個人都知道不可追高殺低,但是漲到你忍不住,你還是買了
耐心等到,是賺錢的不二法則,卻也是一種高深的修養


2010年1月5日 星期二

Linux Kernel(9)- Kthread


在kernel中建立thread可以使用kthread_create(),建立一個task,然後在調用wake_up_process(task)讓task真正的運行,如果要kill一個kthread可以使用kthread_stop()。
在kernel中,將kthread_create()和wake_up_process()包裝成kthread_run(),也就是調用了kthread_run()之後,該thread會立刻被執行。
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kthread.h>

MODULE_LICENSE("GPL");

static struct task_struct *brook_tsk;
static int data;
static int kbrook(void *arg);

static int kbrook(void *arg)
{
    unsigned int timeout;
    int *d = (int *) arg;

    for(;;) {
        if (kthread_should_stop()) break;
        printk("%s(): %d\n", __FUNCTION__, (*d)++);
        do {
            set_current_state(TASK_INTERRUPTIBLE);
            timeout = schedule_timeout(10 * HZ);
        } while(timeout);
    }
    printk("break\n");

    return 0;
}

static int __init init_modules(void)
{
    int ret;

    brook_tsk = kthread_create(kbrook, &data, "brook");
    if (IS_ERR(brook_tsk)) {
        ret = PTR_ERR(brook_tsk);
        brook_tsk = NULL;
        goto out;
    }
    wake_up_process(brook_tsk);

    return 0;

out:
    return ret;
}

static void __exit exit_modules(void)
{
    kthread_stop(brook_tsk);
}

module_init(init_modules);
module_exit(exit_modules);


linux/kthread.h
/**
 * kthread_run - create and wake a thread.
 * @threadfn: the function to run until signal_pending(current).
 * @data: data ptr for @threadfn.
 * @namefmt: printf-style name for the thread.
 *
 * Description: Convenient wrapper for kthread_create() followed by
 * wake_up_process().  Returns the kthread or ERR_PTR(-ENOMEM).
 */
#define kthread_run(threadfn, data, namefmt, ...)      \
({            \
 struct task_struct *__k         \
  = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
 if (!IS_ERR(__k))         \
  wake_up_process(__k);        \
 __k;           \
})


熱門文章