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>