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