HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В этом уроке мы рассмотрим еще одну систему - рациональные числа и операции над ними, а также научимся видеть барьеры абстракции и выделять слои.</p>
1 <p>В этом уроке мы рассмотрим еще одну систему - рациональные числа и операции над ними, а также научимся видеть барьеры абстракции и выделять слои.</p>
2 <h2>Рациональное число</h2>
2 <h2>Рациональное число</h2>
3 <p>Рациональным называют число, которое может быть представлено в виде дроби a/b, где а - это числитель дроби, b - знаменатель дроби. Причем b не должно быть нулем, так как делить на нуль нельзя.</p>
3 <p>Рациональным называют число, которое может быть представлено в виде дроби a/b, где а - это числитель дроби, b - знаменатель дроби. Причем b не должно быть нулем, так как делить на нуль нельзя.</p>
4 <p>Рациональные числа в Python не поддерживаются, поэтому абстракцию для них создадим самостоятельно. Нам понадобятся конструктор и селекторы:</p>
4 <p>Рациональные числа в Python не поддерживаются, поэтому абстракцию для них создадим самостоятельно. Нам понадобятся конструктор и селекторы:</p>
5 <p>С помощью трех функций мы определили рациональное число. Конструктор собирает его из частей, селекторы позволяют извлечь каждую часть. Чем при этом является num с точки зрения языка - не важно. Это может быть функция, список или словарь. Во внутренней реализации можно использовать даже строки:</p>
5 <p>С помощью трех функций мы определили рациональное число. Конструктор собирает его из частей, селекторы позволяют извлечь каждую часть. Чем при этом является num с точки зрения языка - не важно. Это может быть функция, список или словарь. Во внутренней реализации можно использовать даже строки:</p>
6 <p>Мы научились представлять рациональные числа, но эта абстракция малоприменима. Она становится полезна, когда появляется возможность оперировать ей.</p>
6 <p>Мы научились представлять рациональные числа, но эта абстракция малоприменима. Она становится полезна, когда появляется возможность оперировать ей.</p>
7 <p>Для рациональных чисел базовыми операциями можно считать арифметические, например, сложение, вычитание или умножение. Умножение рациональных чисел - самая простая операция. Для ее выполнения нужно перемножить числители и знаменатели:</p>
7 <p>Для рациональных чисел базовыми операциями можно считать арифметические, например, сложение, вычитание или умножение. Умножение рациональных чисел - самая простая операция. Для ее выполнения нужно перемножить числители и знаменатели:</p>
8 <p>Если предположить, что реальная структура рационального числа выглядит так: {"numer": 2, "denom": 3}, то решение может быть таким:</p>
8 <p>Если предположить, что реальная структура рационального числа выглядит так: {"numer": 2, "denom": 3}, то решение может быть таким:</p>
9 <p>С точки зрения вызывающего кода абстракция сохранена. На вход в multiply_rational подаются рациональные числа, на выходе - рациональное число. Но внутри абстракции нет, так как обращение с рациональными числами строится на основе знания их устройства.</p>
9 <p>С точки зрения вызывающего кода абстракция сохранена. На вход в multiply_rational подаются рациональные числа, на выходе - рациональное число. Но внутри абстракции нет, так как обращение с рациональными числами строится на основе знания их устройства.</p>
10 <p>Чтобы изменить внутреннюю реализацию рациональных чисел, придется переписать все операции, которые работают с рациональными числами напрямую - то есть без селекторов или конструктора. Данный код нарушает принцип одного уровня абстракции - single layer abstraction.</p>
10 <p>Чтобы изменить внутреннюю реализацию рациональных чисел, придется переписать все операции, которые работают с рациональными числами напрямую - то есть без селекторов или конструктора. Данный код нарушает принцип одного уровня абстракции - single layer abstraction.</p>
11 <h2>Уровневое проектирование</h2>
11 <h2>Уровневое проектирование</h2>
12 <p>При разработке сложных систем используется подход -<strong>уровневое проектирование</strong>. В его случае системе придается структура с помощью последовательных уровней. Каждый из уровней строится путем комбинации частей, которые на данном уровне рассматриваются как элементарные. Части, которые строятся на каждом уровне, работают как элементарные на следующем:</p>
12 <p>При разработке сложных систем используется подход -<strong>уровневое проектирование</strong>. В его случае системе придается структура с помощью последовательных уровней. Каждый из уровней строится путем комбинации частей, которые на данном уровне рассматриваются как элементарные. Части, которые строятся на каждом уровне, работают как элементарные на следующем:</p>
13 <p>Уровневое проектирование проходит через всю технику построения сложных систем. Например, в разработке программного обеспечения уровневое проектирование может начинаться с создания низкоуровневых функций и библиотек, которые решают конкретные задачи. К таким задачам могут относиться обработка данных, сетевое взаимодействие или графический интерфейс.</p>
13 <p>Уровневое проектирование проходит через всю технику построения сложных систем. Например, в разработке программного обеспечения уровневое проектирование может начинаться с создания низкоуровневых функций и библиотек, которые решают конкретные задачи. К таким задачам могут относиться обработка данных, сетевое взаимодействие или графический интерфейс.</p>
14 <p>Затем эти функции и библиотеки объединяются для создания модулей, которые предоставляют более высокоуровневые возможности. Модули можно использовать, чтобы построить полноценные приложения, которые включают большое количество функциональных возможностей и обеспечивают решение более крупных задач.</p>
14 <p>Затем эти функции и библиотеки объединяются для создания модулей, которые предоставляют более высокоуровневые возможности. Модули можно использовать, чтобы построить полноценные приложения, которые включают большое количество функциональных возможностей и обеспечивают решение более крупных задач.</p>
15 <p>Посмотрим на пример кода:</p>
15 <p>Посмотрим на пример кода:</p>
16 <p>Здесь базовым уровнем являются типы, которые встроены в сам язык: числа и словарь. На их основе сформирован уровень для представления рациональных чисел: make_rational, get_denom, get_numer. Затем - уровень, на котором реализованы арифметические операции над рациональными числами: сложение, вычитание, умножение и так далее.</p>
16 <p>Здесь базовым уровнем являются типы, которые встроены в сам язык: числа и словарь. На их основе сформирован уровень для представления рациональных чисел: make_rational, get_denom, get_numer. Затем - уровень, на котором реализованы арифметические операции над рациональными числами: сложение, вычитание, умножение и так далее.</p>
17 <p>Речь идет про реализацию самих уровней. Например, операция сложения полностью опирается на конструктор и селекторы, но ничего не знает и не может знать про внутреннее устройство самих рациональных чисел. С другой стороны, это не значит, что в одном месте не могут появиться функции из разных уровней. Это нормально во многих случаях. Например:</p>
17 <p>Речь идет про реализацию самих уровней. Например, операция сложения полностью опирается на конструктор и селекторы, но ничего не знает и не может знать про внутреннее устройство самих рациональных чисел. С другой стороны, это не значит, что в одном месте не могут появиться функции из разных уровней. Это нормально во многих случаях. Например:</p>
18 <h2>Выводы</h2>
18 <h2>Выводы</h2>
19 <p>В этом уроке мы рассмотрели еще одну систему - рациональные числа и операции над ними. Так как в Python рациональные числа не поддерживаются, нам предстояло самостоятельно создать для них абстракцию.</p>
19 <p>В этом уроке мы рассмотрели еще одну систему - рациональные числа и операции над ними. Так как в Python рациональные числа не поддерживаются, нам предстояло самостоятельно создать для них абстракцию.</p>
20 <p>Также мы разобрались, как видеть барьеры абстракции и выделять слои. Мы узнали, что такое уровневое проектирование. Оно применяется при разработке сложных систем и проходит через всю технику их построения.</p>
20 <p>Также мы разобрались, как видеть барьеры абстракции и выделять слои. Мы узнали, что такое уровневое проектирование. Оно применяется при разработке сложных систем и проходит через всю технику их построения.</p>