Я недавно думал о том, что я не всегда использую красивые концепции ОО при написании программ на Pythonic. В частности, я подумал, что мне было бы интересно увидеть язык, на котором я мог бы написать типичный веб-скрипт как
# 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')
Видишь, что происходит? Я пытаюсь сделать как можно больше предметов; каждый абзац объявляет что-то, что я называю transform . Например, есть преобразование 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]
Однако я хочу, чтобы не мог указать, что объект должен измениться , если только входы, из которых сделаны объекты, не изменятся; и нет возможности иметь побочные эффекты. Это делает для резкого упрощения языка. Я считаю, что это означает, что мы делаем функциональное программирование («парадигма программирования, которая рассматривает вычисления как оценку математических функций и избегает состояния и изменчивых данных»).
Я, конечно, стараюсь использовать такие вещи, как классы Python, инфраструктура M-V-C и Django (благодаря ответу), но я не думаю, что у них есть концепции выше и ниже.
- Каждый объект имеет поле
value
, к которому можно обратиться, просто написав имя класса.
- Если куда-то ссылается
HTTPHeader
, это означает, что статический неизменяемый объект HTTPHeader
создается как можно скорее. Все ссылки на HTTPHeader
затем ссылаются на этот объект.
- Предположим, я хочу повторить программу с тем же объектом
URI
, пока интерпретатор еще находится в памяти. Поскольку Flags
зависит только от URI
и HTTPHeaders
только от Flags
, они не пересчитываются. Однако, если Database
изменено, то Questions
необходимо пересчитать, и, следовательно, HTTPOutput
также может измениться.
- Интерпретатор автоматически определяет правильную последовательность инициализации классов. Конечно, их зависимость должна сформировать дерево.
Я считаю, что это будут полезные модели для таких программ, как веб-скрипты, где нет побочных эффектов. Есть ли полезный язык, на котором уже пишут программы, подобные этой?