Nano Hash - криптовалюты, майнинг, программирование

То, что подразумевается под абстракциями, не должно зависеть от деталей. Детали должны зависеть от абстракций в смысле принципа инверсии зависимостей [DIP]?

Прежде чем задать этот вопрос, я хотел бы сказать, что это вопрос в stackoverflow очень похож на мой вопрос, но все же концепция не ясна, очень запутана.

Я пытаюсь понять принцип инверсии зависимостей, но не могу понять его полностью?

Ниже приведены две точки, о которых говорит DIP.

A. Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций. Б. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Я могу понять первый пункт, но не могу понять второй, похоже, что оба они одинаковы. После долгих поисков в stackoverflow и других сайтах я могу понять, что оба пытаются сказать разные вещи, но я не смог этого понять.

Рассмотрим пример:

Рассмотрим класс SalaryCalculator [модуль высокого уровня], который используется для расчета заработной платы сотрудника. Который использует BonusCalculator [модуль высокого уровня] для расчета заработной платы, как показано ниже. Поскольку SalaryCalculator использует BonusCalculator, он нарушает первый пункт «Модули высокого уровня не должны зависеть от модулей низкого уровня». Оба должны зависеть от абстракций».

введите здесь описание изображения

Итак, мы ввели абстракцию между ними, как показано ниже:

введите здесь описание изображения

Здесь детали [модули низкого и высокого уровня] зависят от абстракции, а абстракция не зависит от деталей. Итак, в DIP, что пытается сказать вторая точка? Если оба одинаковы, почему это сделано как две точки?

Если кто-нибудь даст мне пример кода, это будет очень полезно.


Ответы:


1

Давайте разберем эту часть B дальше.

Абстракции не должны зависеть от деталей. Это может означать, что ваше объявление интерфейса (ваша абстракция) не должно включать конкретные типы. Подумайте о разнице между distance(int X1, int Y1, int X2, int Y2) и distance(Point A, Point B). Что делать, если у вас есть координаты, измеренные в системе с плавающей запятой, широте/долготе или полярной системе координат? Что, если вы перейдете в трехмерное пространство? Вам придется заново реализовать каждую подпрограмму, использующую вашу функцию расстояния.

Детали должны зависеть от абстракций. Насколько это возможно, продолжайте использовать уровень абстракции, чтобы избежать зависимостей от конкретных типов.

Все дело в том, чтобы свести к минимуму влияние изменений. Чем меньше ваш код зависит от других вещей, тем больше он позволяет изменять этот другой код.

19.10.2018

2

Этот вопрос действительно лежит в основе того, почему ООП полезен и почему абстракции так важны для информатики. По сути, мы используем абстракции, когда хотим скрыть сложность (детали) от пользователей нашего программного обеспечения.

Например, если я пишу Калькулятор премий, а вы пишете Калькулятор зарплаты, я хочу иметь возможность вносить коррективы в свой код, не нарушая работу вашего приложения.

Это требует, чтобы мы оба договорились об определенной абстракции, которая никогда не изменится. Я предоставляю вам методы для доступа к функциям моего кода и обещаю вам, что вызов этих методов всегда будет давать вам одинаковые результаты, даже несмотря на то, что «детали» моей реализации могут меняться со временем.

Итак, возвращаясь к первоначальным вопросам:

О. Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций.

  • Путем «абстрагирования» функций, содержащихся в низкоуровневом модуле (Калькулятор бонусов), вы сможете относительно легко переключиться на чей-то еще калькулятор бонусов, если посчитаете мой сервис бесполезным.
  • Это потому, что вы защитили себя от «деталей» моего кода с помощью абстракции.

B. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

  • Если бы ваша абстракция зависела от деталей моего кода, вам пришлось бы все переписать, чтобы переключиться на новый калькулятор бонусов! Это разрушило бы цель.

Пример кода (javascript):

  • Скажем, у нас есть абстракция под названием «сумма», которая просто вычисляет сумму двух чисел. Вы являетесь потребителем этой функции и хотите использовать ее следующим образом: sum(2,2) = 4.
  • Теперь скажем, что есть два разных модуля (функции), которые вычисляют сумму.

    1. function sum(a, b) { return a + b }
    2. function sum(b, a) { return b + a }
  • Очевидно, что эти функции совершенно одинаковы, но представьте, если бы это было сложное вычисление с множеством различных способов получения результата, каждый из которых имел бы очень разную производительность во время выполнения. Вы могли бы свободно проверить, какая функция работает лучше для вас, используя тот же интерфейс: просто вызывая sum(). Абстракция не зависит от деталей.

  • Сделав это так, ваш высокоуровневый модуль также больше не зависит от низкоуровневого модуля, поскольку вы можете относительно легко попробовать другой низкоуровневый модуль.

Извините, этот ответ немного беспорядочный. Надеюсь это поможет!

17.10.2018
  • Я пытаюсь понять разницу, не могли бы вы немного пояснить? 17.10.2018
  • Возможно, это поможет, если вы будете думать не о деталях как о модулях, а скорее о коде, который живет внутри каждого модуля. В этой модели детали находятся на самом низком уровне. Детали — это фактический код, который выполняется, независимо от того, что получается в результате выполнения кода. Очень запутанно, но я думаю, что в конце концов это щелкнет. 17.10.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..