Илья Идущий

Здравствуйте! Мое решение https://ru.hexlet.io/code_reviews/270077. В общем, я по своему понял условие задачи в рамках создания прямоугольника. В итоге прошел все проверки, но решение совершенно другое. Уважаемый ментор, если не затруднит разобраться в моем монстре, прокомментируйте решение, пожалуйста. PS. function containsOrigin мог решить через array_reduce, каюсь.

4 0

Станислав Дзисяк

Приветствую, Илья!

В данной реализации выполняется много лишних действий. Обратите внимание, что изначально при создании прямоугольника в функцию передаются готовые данные: точка, длина, высота. А далее в функциях getStartPoint, getWidth, getHeight вам приходится заново вычислять эти данные. Кроме того, функция getStartPoint создаёт точку основываясь на том, что это массив в котором первый элемент координата x, а второй - координата y. Это и есть нарушение уровня абстракции Если реализация точки изменится, данная функция перестанет работать. Также обратите внимание, что для реализации функции containsOrigin нет необходимости проверять все 4 точки, а достаточно проверить только 2. Поэтому тут также можно было поступить проще. Порекомендую вам изучить и разобраться как работает решение учителя.

1

Илья Идущий

Станислав Дзисяк, да, я понимаю, что оптимальней использовать только три параметра, а не создавать массив из четырех координат. Соответственно, исходя из моего решения логично было применение именно моей реализации функции getStartPoint. За исключением того, что я использовал индексированный массив, а не ассоциативный. Вы это имели ввиду, когда указали "Это и есть нарушение уровня абстракции"? Ну а по поводу containsOrigin - в конечном решении это был вроде третий вариант))). Жаль, что не додумался до диагональной проверки(. В решении учителя разобрался сразу, но так как у меня изначально получился несколько иной подход, поэтому и попросил разбор полета).

0

Станислав Дзисяк

Приветствую, Илья!

Соответственно, исходя из моего решения логично было применение именно моей реализации функции getStartPoint.

Если опираться на вашу структуру прямоугольника, то в методе getStartPoint достаточно просто вернуть $rectangle[0], а не заново создавать точку.

За исключением того, что я использовал индексированный массив, а не ассоциативный. Вы это имели ввиду, когда указали "Это и есть нарушение уровня абстракции"?

Нет. Тут изначально проблема в том, что вы используете массив. А если структура точки в будущем изменится, и будет возвращаться вообще не массив, тогда весь код сломается. Поэтому с абстракциями нужно работать используя интерфейсные методы, которые они предоставляют. В данном случае, если необходимо создать точку, нужно использовать функцию конструктор makeDecartPoint (по аналогии как вы поступили в методе getNextPoint). Таким образом, какие изменения бы не произошли во внутренней структуре "точки", код который её использует, будет и далее работать корректно.

1

Илья Идущий

Станислав, благодарю!

0

Похожие вопросы

Denis Skvortsov 23 мая 2020 →

Я, конечно, здорово накрутил лишнего и ненужного, но тем не менее в процессе появился вопрос. Допустим, у м...

Дмитрий И 16 февраля 2020 →

На этом упражнение до меня дошло, что такое абстракция! Супер! Правда не сразу понял задание, не мог понять...

Артур Крючок 20 января 2020 →

https://ru.hexlet.io/code_reviews/198890 - перемудрил в containsOrigin - одна лишняя проверка. Но вопрос во...

Dmitry Plotnikov 14 октября 2019 →

Как между собой соотносятся термины 'уровневое проектирование' и 'барьеры абстракции'?

Evgen Guba 26 июля 2019 →

Лично для меня вызвало сложность понимание данного урока. Читаю в 5-ый раз, но туго доходить суть написанно...

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Javascript, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →