0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Fluent Interface или текучий интерфейс - это подход проектирования объектно-ориентированных API. Он симулирует естественный язык, благодаря чему повышает читаемость кода. Этот подход может быть особенно полезным в Python, который известен своей читаемостью и простотой.</p>
1
<p>Fluent Interface или текучий интерфейс - это подход проектирования объектно-ориентированных API. Он симулирует естественный язык, благодаря чему повышает читаемость кода. Этот подход может быть особенно полезным в Python, который известен своей читаемостью и простотой.</p>
2
<p>В этом уроке мы рассмотрим применение Fluent Interface для повышения читаемости и гибкости кода.</p>
2
<p>В этом уроке мы рассмотрим применение Fluent Interface для повышения читаемости и гибкости кода.</p>
3
<h2>Fluent Interface</h2>
3
<h2>Fluent Interface</h2>
4
<p>Рассмотрим пример обработки коллекций:</p>
4
<p>Рассмотрим пример обработки коллекций:</p>
5
<p>Здесь мы строим цепочку вызовов, где каждый метод возвращает объект того же типа, что и первоначальный объект, но в измененной форме. Этот подход позволяет строить цепочки вызовов произвольной длины, что и обозначается термином fluent interface.</p>
5
<p>Здесь мы строим цепочку вызовов, где каждый метод возвращает объект того же типа, что и первоначальный объект, но в измененной форме. Этот подход позволяет строить цепочки вызовов произвольной длины, что и обозначается термином fluent interface.</p>
6
<p>Схематически цепочка выглядит так: collection.map(...).reject(...). Это схоже с тем, как работают цепочки вызовов в JavaScript, где такой подход - основной способ строить вычисления на коллекциях.</p>
6
<p>Схематически цепочка выглядит так: collection.map(...).reject(...). Это схоже с тем, как работают цепочки вызовов в JavaScript, где такой подход - основной способ строить вычисления на коллекциях.</p>
7
<p>Fluent Interface упрощает чтение и обработку данных. Для его реализации в Python существуют разные подходы. Начнем с самого простого - использования self.</p>
7
<p>Fluent Interface упрощает чтение и обработку данных. Для его реализации в Python существуют разные подходы. Начнем с самого простого - использования self.</p>
8
<h2>self</h2>
8
<h2>self</h2>
9
<p>Первый способ создания Fluent Interface основан на возврате self из методов, которые участвуют в построении цепочек. self - ссылка на тот объект, в контексте которого вызывается метод, поэтому его можно возвращать как обычное значение:</p>
9
<p>Первый способ создания Fluent Interface основан на возврате self из методов, которые участвуют в построении цепочек. self - ссылка на тот объект, в контексте которого вызывается метод, поэтому его можно возвращать как обычное значение:</p>
10
<p>У этого способа есть один недостаток - объект изменяется. Это значит, что нельзя взять и просто переиспользовать объект-коллекцию для разных выборок, потому что они начнут накладываться друг на друга.</p>
10
<p>У этого способа есть один недостаток - объект изменяется. Это значит, что нельзя взять и просто переиспользовать объект-коллекцию для разных выборок, потому что они начнут накладываться друг на друга.</p>
11
<p>На практике часто используется другой подход, с которым мы уже познакомились в прошлом курсе. Нужно добавить немного функциональности в ООП - возвращать не self, а создавать новый объект того же типа с обновленной коллекцией:</p>
11
<p>На практике часто используется другой подход, с которым мы уже познакомились в прошлом курсе. Нужно добавить немного функциональности в ООП - возвращать не self, а создавать новый объект того же типа с обновленной коллекцией:</p>
12
<p>Теперь каждый вызов возвращает новый объект. Такой код значительно безопаснее в использовании и позволяет без проблем переиспользовать новые коллекции. Изменение одной не приведет к автоматическому изменению всех остальных.</p>
12
<p>Теперь каждый вызов возвращает новый объект. Такой код значительно безопаснее в использовании и позволяет без проблем переиспользовать новые коллекции. Изменение одной не приведет к автоматическому изменению всех остальных.</p>
13
<p>Теперь углубимся и рассмотрим более продвинутый и безопасный способ. Этот метод позволяет создавать новые объекты и сохранять исходные данные без изменений.</p>
13
<p>Теперь углубимся и рассмотрим более продвинутый и безопасный способ. Этот метод позволяет создавать новые объекты и сохранять исходные данные без изменений.</p>
14
<h2>self.class</h2>
14
<h2>self.class</h2>
15
<p>В каждом методе, который участвует в создании текучего интерфейса, последняя строчка всегда содержит один и тот же вызов: Collection(coll). Ее можно записать проще, не дублируя названия класса. Вместо возврата нового экземпляра класса Collection напрямую можно воспользоваться self.</p>
15
<p>В каждом методе, который участвует в создании текучего интерфейса, последняя строчка всегда содержит один и тот же вызов: Collection(coll). Ее можно записать проще, не дублируя названия класса. Вместо возврата нового экземпляра класса Collection напрямую можно воспользоваться self.</p>
16
<p>В Python self используется для обозначения текущего экземпляра класса. Когда вызывается self.__class__(coll), создается новый экземпляр текущего класса, что идентично вызову Collection(coll):</p>
16
<p>В Python self используется для обозначения текущего экземпляра класса. Когда вызывается self.__class__(coll), создается новый экземпляр текущего класса, что идентично вызову Collection(coll):</p>
17
<p>Этот прием обеспечивает большую гибкость при наследовании классов, так как self.__class__ всегда ссылается на класс текущего экземпляра, а не на конкретно указанный класс.</p>
17
<p>Этот прием обеспечивает большую гибкость при наследовании классов, так как self.__class__ всегда ссылается на класс текущего экземпляра, а не на конкретно указанный класс.</p>
18
<h2>Выводы</h2>
18
<h2>Выводы</h2>
19
<p>Применение Fluent Interface может значительно улучшить читаемость и гибкость кода. Однако следует быть осторожным при выборе между изменяемым и неизменяемым вариантами, так как оба подхода имеют свои преимущества и недостатки. Важно выбирать подход в соответствии с требованиями вашего приложения.</p>
19
<p>Применение Fluent Interface может значительно улучшить читаемость и гибкость кода. Однако следует быть осторожным при выборе между изменяемым и неизменяемым вариантами, так как оба подхода имеют свои преимущества и недостатки. Важно выбирать подход в соответствии с требованиями вашего приложения.</p>