Директно и просто

Последния път разгледахме „разликата между инверсия на зависимости и инжектиране на зависимости“. И двете са важни концепции, които ни помагат да създаваме по-добър софтуер. Една от ключовите разлики обаче е, че инжектирането на зависимост е модел, а инверсията на зависимост е принцип.

Днес ще обсъдим защо това е важна разлика.

Какво представляват принципите?

Принципите са фундаментални истини. Те служат като основа, върху която могат да се изграждат по-сложни системи и теории. Когато става въпрос за създаване на нови неща, принципите са от решаващо значение. Те ни позволяват да „постигаме експоненциални резултати“, като свързваме точките по нови и немислени досега начини. Принципите служат като противоотрова срещу постоянната промяна в света, промяна, която изглежда се ускорява.
Примери за принципи могат да бъдат намерени във всяка област на живота:

  • В софтуерното инженерство имаме принципите на SOLID дизайн.
  • В психологията имаме „принципа на удоволствието“.
  • Във физиката имаме „принципите на движението“.

Какво представляват моделите?

Моделите са просто нещо, което се повтаря по предвидим начин.
Нашите мозъци са страхотни в идентифицирането на модели. Не само това, те са добри в предсказването какво означават тези модели, като използват индуктивно мислене.
Примери за модели също могат да бъдат намерени във всяка област на живота:

  • В софтуерното инженерство имаме „модели на проектиране“.
  • В модната индустрия имаме „модели като шаблони“.
  • В природата имаме „визуални модели“ на симетрия, фрактали и др.

Защо трябва да разчитате на Принципи

Всички търсим нещо стабилно, на което да разчитаме, на някаква основна истина, която надхвърля контекста и променящите се технологии. Е, не търсете повече, Принципите са точно това, от което се нуждаем.

Човешката нужда от храна е принцип. (С изключение на Breatharians, те твърдят, че оцеляват на въздух и слънце). Можете да разчитате на това като на аксиома, няма да се промени, докато хората остават хора.

За разлика от това човешката нужда от пица е модел. Ако се разхождате сред млади хора, особено млади софтуерни инженери, това почти ще изглежда като принцип – пицата е невероятна и трябва да е основна човешка нужда. Въпреки това, подобно на други модели, нашата привидно универсална любов към пицата зависи от контекста. Ако сте на диета, пицата бързо се превръща в анти-модел – нещо, което трябва да избягвате на всяка цена.

Принципи в софтуерното инженерство

В света на софтуерното инженерство ние също имаме принципи, които ни служат като ориентир при проектирането на софтуер.

Вземете инверсията на зависимостта като пример. Това е част от 5-те основни принципа на SOLID. С две думи - това означава, че трябва да разчитаме на абстракции, а не на конкретни реализации. Този принцип ни помага да проектираме стабилен и поддържаем софтуер. Няма контекст, който да ни принуди да предпочитаме конкретни реализации пред абстракции, тъй като цената на използването на абстракции е незначителна, докато цената на промяна към конкретна реализация е потенциално неограничена.

Модели в софтуерното инженерство

Светът на софтуерното инженерство също е пълен с модели, някои от тях се считат за „лоши“ и сме склонни да ги наричаме „Анти-модели“, най-запомнящият се от които е страховитият „Код на спагетите“. Докато някои се считат за „добри“ и ние просто ги наричаме „модели на дизайна“.

Анти-шаблоните се считат за лоша практика, път към безкрайни проблеми и грешки, знак за неопитни инженери. Те са нещо, което трябва да се избягва на всяка цена. Те все още се считат за модели, тъй като са склонни да се случват доста предсказуемо, особено с неопитни инженери. В примера на „Кодексът на спагетите“ това е просто проява на дезорганизирано мислене, което обикновено се появява естествено, когато се опитвате да разрешите проблем без предварително планиране или опит.

Шаблоните за проектиране се считат за добра практика — използването на нашия колективен опит като софтуерни инженери за намиране на елегантни решения на общи проблеми. Проблемът е, че понякога дори „добрите“ модели могат да бъдат злоупотребени, потенциално превръщайки ги в анти-модели.

Дизайнерски модели - доброто, лошото и може би

Има много примери за модели на проектиране, но като правило добрият модел на проектиране се корени в принципите на проектиране.
Например, Dependency Injection е страхотен модел на проектиране, който ни позволява да отделим създаването от употребата. Той намалява свързването, подобрява тестването и се корени в принципите на проектиране - това е реализация на принципа на инверсия на зависимостта.

Някои модели обаче не са толкова общоприети, най-вече защото не са дълбоко вкоренени в принципите на дизайна.
Например, нека да разгледаме модела Singleton. Повечето хора го смятат за полезен модел на проектиране. Използва се в случаите, когато е необходим само един екземпляр на клас и наличието на множество екземпляри може да бъде пагубно. Този модел е полезен, когато искаме да създадем един екземпляр за кеш, конфигурационен файл или регистратор.

Някои хора обаче го смятат за анти-модел. Често срещано твърдение е, че моделът нарушава принципа на единичната отговорност (S в SOLID), тъй като контролира своя жизнен цикъл и налага поведението на единичния екземпляр върху себе си. По мое мнение това не е точно, тъй като контролът на екземплярите е ортогонален на функционалността, а SRP се отнася до функционалността. По-валидно твърдение е, че Singletons нарушават принципа на инверсия на зависимостта, тъй като зависи от конкретната реализация - достъп до Singleton чрез неговите конкретни статични методи, вместо да разчитате на абстракции. Това води до тясно свързване, което прави нашия код по-малко поддържаем и по-податлив на грешки, ако възникнат промени.
Това не означава, че моделът Singleton е присъщо лош, но ако изглежда, че моделът нарушава принципите, вие трябва да бъдете внимателни, преди да го приложите.

Какво научихме днес

В софтуерното инженерство, както и в живота, имаме модели и имаме принципи. Откриването на модели и използването им за решаване на общи проблеми може да бъде изключително полезно. Въпреки това, модели, които не са дълбоко вкоренени в принципите, може да се окажат анти-шаблони - причинявайки повече проблеми, отколкото решавайки.

Следващия път, когато откриете, че научавате за нов модел на проектиране или дори искате да приложите съществуващ такъв, запитайте се – този модел корени ли се в солидни (игра на думи) принципи на дизайн? Или може потенциално да причини непредвидени проблеми по пътя?

Надявам се, че сте намерили тази статия за полезна и до следващия път я запазете ясна и проста!