HTML Diff
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>