Re: [問題] 函數、程式結構如何設計?

作者: ThxThx (洗洗睡)   2018-04-03 05:22:38
也許有點和你原本提的方向不符合,不過凌晨醒來睡不著= =,個人淺見和大家分享。
我自己是覺得Python是一個環繞資料來設計的物件導向語言,而且這樣的OOP和Java的OOP
有相當的差異。例如說,幾乎不會看到Python class會有getter/setter。物件基本上是
透明的,大部分情況所有內部的資料都可以從外面讀取。
這樣的情況下,會有兩種設計方向:
1. 既然都是public members,class不需要有太多函式,用外部function來操作物件。
2. 讓上層物件呼叫子物件的member functions。一個class的member functions代表其
對子物件的所有操作。
Python的答案比我接觸過的語言都更偏向2。事實上,我覺得第一種情況Python內建的
list、dict、set還有一堆一起組合利用的內建函數(除了常見的sum、len、zip,還有一堆
在itertools和functools裡)就在做這件事。使用者大部分的時候都在設計怎麼操作儲存
1.的物件。如果你有看過開源Python library的話,你會發現最核心的code通常都是class
(設計物件來操作資料),只有helper functions和最外層的API會是function。
針對第一種情況,官方文件有個頁面叫Python Data Model(很硬,不建議直接看)就在講
怎麼透過定義特殊的member functions來設計好用的class。這裡的『好用』指的是可以用
Pythonic的方式來操作,例如可以定義obj[1:2, :]或reversed(obj)是什麼意思這樣。
回到你的問題,原本的兩個例子我想都是合理、看情況使用的用法。但你提到當程式越來
越複雜很難處理,我覺得癥結點也許是沒有正確設計class來代表、儲存想要處理的資料,
而這是Python常被忽略(因為語法太簡單了好像隨便寫寫都可以)卻又很重要的特色之一
,而且我發現版上很少有這樣的討論。
不小心打太多了,希望有高手來指導一下scalable python project的開發經驗。
最後放個最近看到的小型server框架Flask的source code當作例子,我想只要打開每個檔
案瞄一眼就了解我的意思了。
https://github.com/pallets/flask/tree/master/flask
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2018-04-03 06:47:00
我覺得有些名詞應該要定義一下比較好,另外getter setter用的可多了吧
作者: aszx4510 (wind)   2018-04-03 12:25:00
上次在版上有看到一篇文 詳細說明setter getter#1QIcP7lk (Python) setter getter 是很常用的東西Python專門創一個decorator語法支援這個功能
作者: wallrose (牆玫瑰)   2018-04-03 15:41:00
感謝回文 很有幫助
作者: s860134 (s860134)   2018-04-03 19:38:00
最早有 set get ,property 後來加入老實說我不太懂這和 物件導向有啥關係你一直強調 public 這也和 oo沒啥關係
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2018-04-03 21:12:00
其實雖然是沒有真正的private 但也不代表一定要直接存取它
作者: s860134 (s860134)   2018-04-04 02:12:00
你不希望使用你 module 的成員就用 _ 前墜就好真正實現了 privte/protect/public 說真的沒啥意義

Links booklink

Contact Us: admin [ a t ] ucptt.com