Python 3 Tutorial 第七堂(2)程式庫 vs 框架


Web 應用程式的撰寫是 Python 的一個應用,做為入門 Python,也是個不錯的練習對象,因此接下來要看看如何使用 Python 來撰寫 Web 應用程式,使用的框架(Framework)是 Django。

只是…什麼是框架?它跟程式庫(Library)有何不同?

誰控制了流程?

從課程一開始,你就一直在使用程式庫,你的程式流程一直在你的控制之內,你決定了程式何時要使用程式庫來詢問使用者問題、何時要讀取使用者回應、何時要處理結果 … 就像是以下的程式中,你決定在流程中使用程式庫中的 input 函式、自定義的 process_name 函式以及 process_quest 函式等 …

name = input('What is your name?')
process_name(name)
quest = input('What is your quest?')
process_quest(quest)

當你開始使用框架,你會發現不是你決定程式流程,你會定義函式,由框架決定何時來呼叫你定義的函式。流程的控制權被反轉了,現在是框架在定義流程,在既定的流程中框架會呼叫你的函式,而不是你來呼叫框架。例如,你會使用 GUI 框架 Tkinter 來組合這樣的視窗 …

程式庫 vs 框架

你需要依框架的要求進行畫面組合,並安排好等待被呼叫的一些自定義函式,像是 say_hi 之類的 … 例如 …

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

    def createWidgets(self):
        self.hi_there = tk.Button(self)
        self.hi_there["text"] = "Hello World\n(click me)"
        self.hi_there["command"] = self.say_hi
        self.hi_there.pack(side="top")

        self.QUIT = tk.Button(self, text="QUIT", fg="red",
                                            command=root.destroy)
        self.QUIT.pack(side="bottom")

    def say_hi(self):
        print("hi there, everyone!")

root = tk.Tk()
app = Application(master=root)
app.mainloop()

當使用者作出動作,框架會有既定的處理流程,並在對應的時機點呼叫你定義的函式。

IoC(Inversion of Control)

在談到框架時,經常會聽到 IoC 這個縮寫名稱,也就是 Inversion of Control,既控制權反轉,什麼控制權被反轉了?誰能決定程式的流程!使用程式庫的話,流程的控制是這樣的 …

程式庫 vs 框架

藍色部份是你可以自行掌控的部份,你決定程式流程走向,並在過程中必要時機,引用各種程式庫! 使用框架的話,流程的控制是這樣的 …

程式庫 vs 框架

藍色部份是你可以自行掌控的部份,也就是框架規範下可進行的元件實作,框架在本身定義的流程下適當時機,會呼叫你的元件實作。

我們需要使用框架嗎?

應用程式開發時是否需要使用框架,有很多考量點 … 然而簡單來說 … 使用程式庫時,開發者會擁有較高的自由度;使用框架時,開發者會受到較大的限制。

限制?有哪些限制?很多 … 是否需要使用框架?是否要遵循框架規範的流程?使用框架是基於技術考量?還是基於商業上的考量?(嗯 … 因為這框架是採購案中被綁在一起的 … 上頭叫我們要用我們就得用?)… 這幾個問題都是必須想想看的 …

股市有句名言,好的老師帶你上天堂,不好的老師帶你住套房。用框架時可以這麼想 … 好的框架帶你上天堂,不好的框架讓你下地獄 … XD