我最近在想我在编写 Pythonic 程序时如何不总是使用 OO 的美丽概念。特别是,我想我会对看到一种可以将典型的 Web 脚本编写为的语言感兴趣
# Fictional language
# This script's combined effect is to transform (Template, URI, Database) -> HTTPOutput
HTTPOutput:
HTTPHeaders + Maintext
Flags: # This is a transform URI -> Flags
value = URI.split('?').after
refresh = 'r' in value
sort = /sort=([a-z])/.search(value)
HTTPHeaders: # This is a transform Flags -> HTTPHeaders
'Content-type:...' + Flags.refresh ? 'Refresh: ...' : ''
Maintext:
Template.replace('$questions', PresentedQuestions [:20] )
Questions:
(Flags.sort = 'r') ? RecentQuestions : TopQuestions
PresentedQuestions:
Questions % '<h4>{title}</h4><p>{body}</p>'
RecentQuestions:
Database.Questions . sort('date')
TopQuestions:
Database.Questions . sort('votes')
走着瞧吧?我正在尝试制作尽可能多的对象;每个段落都声明了我称之为转换的东西。例如,有一个变换
HTTPHeaders
.在将类、对象和函数组合在一起的命令式语言中:class HTTPHeaders_class
{
public char* value
HTTPHeaders_class()
{
value = ... + Flags.refresh ? + ... // [1]
}
}
class Flags_class
{
public char* flagstring;
public bool refresh;
...
Flags_class()
{
value = ... /* [3] */
refresh = ...
}
}
Flags = new Flags_class (URI)
HTTPHeaders = new HTTPHeaders_class (Flags) // [2]
但是,我想要无法指定对象应更改 除非生成对象的输入发生变化;并且没有任何副作用。这导致了语言的极大简化。我相信这意味着我们正在做一个 functional programming (“一种将计算视为数学函数评估并避免状态和可变数据的编程范式”)。
我当然尝试使用 Python 类、M-V-C 框架和 Django 之类的东西(感谢答案),但我认为它们没有上面和下面的概念。
value
只需编写类名即可引用的字段。 HTTPHeader
在某处被引用,这意味着一个静态的、不可更改的对象 HTTPHeader
尽快创建。所有对 HTTPHeader
的引用然后引用这个对象。 URI
重复该程序对象,而解释器仍在内存中。自 Flags
仅取决于 URI
和 HTTPHeaders
仅在 Flags
,这些不会重新计算。但是,如果 Database
被修改,然后 Questions
需要重新计算,因此HTTPOutput
也可能会改变。 我相信这对于像 web 脚本这样没有副作用的程序来说将是一个有用的模型。是否有一种有用的语言可以编写与此类似的程序?
最佳答案
如果您真的想深入研究使用 Python 进行 Web 应用程序开发,那么请查看 Django .在这种情况下,最好使用 MVC 架构,并且 Django 在支持 MVC 应用程序方面做得非常好。
您可能更感兴趣的是 Declarative programming方法而不是功能方法。函数式编程更关注将输入映射为纯(数学)函数的输出。声明式方法就是说明应该发生什么,而不是如何去做。
无论如何,深入研究模型- View - Controller 和 Django。您可能会发现它以完全不同的方式符合要求。
关于language-agnostic - 将函数式语言概念与 OO 结合使用 - 有语言吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/997561/