πŸ€•
pdp
  • Hello world!
  • Base IT Knowledge
    • OOP
      • GRASP
      • SOLID
    • FP
    • Data structures
  • ENGX
    • Design patterns
    • Release Strategy
      • Branching strategies
        • Trunk-Based Development
    • Clean code
      • Authoring/Naming
      • Code smells
      • Refactoring basis
  • Development processes
    • Waterfall
    • Agile
    • Scrum
  • Other
    • React
    • a11y
Powered by GitBook
On this page
  • Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ экспСрт (Information Expert)
  • Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ (Creator)
  • Controller
  • Блабая ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ (Π·Π°Ρ†Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅) ΠΈΠ»ΠΈ Low Coupling
  • Высокая ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ (High Cohesion)
  • Чистая Π²Ρ‹Π΄ΡƒΠΌΠΊΠ° (Pure Fabrication)
  • ΠŸΠΎΡΡ€Π΅Π΄Π½ΠΈΠΊ (Indirection)
  • ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (Polymorphism)
  • Π£ΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΊ измСнСниям (Protected Variations)
  • Useful links

Was this helpful?

  1. Base IT Knowledge
  2. OOP

GRASP

PreviousOOPNextSOLID

Last updated 5 years ago

Was this helpful?

GRASP ( general responsibility assignment software patterns β€” ΠΎΠ±Ρ‰ΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ распрСдСлСния отвСтствСнностСй; Ρ‚Π°ΠΊΠΆΠ΅ сущСствуСт английскоС слово "grasp" β€” Β«ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ, Ρ…Π²Π°Ρ‚ΠΊΠ°Β») β€” ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±Ρ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ отвСтствСнностСй ΠΈ .

GRASP ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹

GRASP - general responsibility assignment software patterns β€” ΠΎΠ±Ρ‰ΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ распрСдСлСния отвСтствСнностСй. GRASP ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±Ρ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ отвСтствСнностСй классам ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ.

БущСствуСт Π΄Π΅Π²ΡΡ‚ΡŒ GRAPS шаблонов, ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ описанных Π² ΠΊΠ½ΠΈΠ³Π΅ ΠšΡ€Π΅ΠΉΠ³Π° Π›Π°Ρ€ΠΌΠ°Π½Π° Β«ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ UML ΠΈ шаблонов проСктирования». Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ классичСских Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ² ΠΈΠ·, GRAPS ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠΉ структуры, Ρ‡Π΅Ρ‚ΠΊΠΎΠΉ области примСнСния ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅ΡˆΠ°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π° лишь ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹/Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ/ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½Π° систСмы.

GRASP состоит ΠΈΠ· 5 основных ΠΈ 4 Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… шаблонов.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹:

  • Information Expert

  • Creator

  • Controller

  • Low Coupling

  • High Cohesion

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹:

  • Pure Fabrication

  • Indirection

  • Polymorphism

  • Protected Variations

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ экспСрт (Information Expert)

Π¨Π°Π±Π»ΠΎΠ½ опрСдСляСт Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ распрСдСлСния отвСтствСнности:

ΠžΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° Ρ‚ΠΎΠΌΡƒ, ΠΊΡ‚ΠΎ Π²Π»Π°Π΄Π΅Π΅Ρ‚ максимумом Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для исполнСния β€” ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌΡƒ экспСрту.

Π­Ρ‚ΠΎΡ‚ шаблон β€” самый ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ ΠΈ Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΈΠ· дСвяти. Если Π΅Π³ΠΎ Π½Π΅ ΡƒΡ‡Π΅ΡΡ‚ΡŒ β€” получится "спагСтти-ΠΊΠΎΠ΄", Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ шаблона ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ экспСрт ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΡΠ²ΡΠ·Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ Π½Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ свойству инкапсуляции.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π° C# класс Customer содСрТит ссылки Π½Π° всС Π·Π°ΠΊΠ°Π·Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΡƒΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ для подсчСта ΠΎΠ±Ρ‰Π΅ΠΉ стоимости Π·Π°ΠΊΠ°Π·ΠΎΠ²:

 public class Customer
    {
        private readonly List<Order> _orders = new List<Order>();

        public decimal GetTotalAmount(Guid orderId)
        {
            return this._orders.Sum(x => x.Amount);
        }
    }

Name: Information Expert Problem: What is a basic principle by which to assign responsibilities to objects? Solution: Assign a responsibility to the class that has the information needed to fulfill it.

Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ (Creator)

Creator ΠΈΠ»ΠΈ Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ β€” ΡΡƒΡ‚ΡŒ отвСтствСнности Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ создаСт Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Π‘Ρ€Π°Π·Ρƒ Π½Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ аналогия с абстрактной Ρ„Π°Π±Ρ€ΠΈΠΊΠΎΠΉ.

По сути шаблон проСктирования Абстрактная Ρ„Π°Π±Ρ€ΠΈΠΊΠ° (созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² концСнтрируСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ классС) это Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° создатСля.

Но Π΅ΡΡ‚ΡŒ ряд ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ надСляСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ создатСля:

  • Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ содСрТит ΠΈΠ»ΠΈ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ создаваСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹;

  • Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ создаваСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ;

  • Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ создаваСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ;

  • Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ записываСт создаваСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

  • Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для A

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ с Customer'ΠΎΠΌ, рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ .NET ΠΊΠΎΠ΄:

public class Customer
    {
        private readonly List<Order> _orders = new List<Order>();

        public void AddOrder(List<OrderProduct> orderProducts)
        {
            var order = new Order(orderProducts); // ΡΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ
            _orders.Add(order);
        }
    }

Name: Creator Problem: Who creates an A? Solution: Assign class B the responsibility to create an instance of class A if one of these is true:

  • B contains or compositely aggregate instances of A

  • B records instances of A

  • B closely use instances of A

  • B has the initializing information for instances of A

Consistent with LRG and the Creator solution, the Board will create Squares.

Controller

Π¨Π°Π±Π»ΠΎΠ½ сontroller ΠΏΡ€ΠΈΠ·Π²Π°Π½ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ раздСлСния интСрфСйса ΠΈ Π»ΠΎΠ³ΠΈΠΊΠΈ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π­Ρ‚ΠΎ Π½Π΅ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстный ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΈΠ· MVC ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ запросов ΠΈ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΊΠΎΠΌΡƒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запросы Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Если ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сontroller, Ρ‚ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… систСмных сообщСний.

Name: Controller Problem: What first beyond the UI layer receives and coordinates a system operation? Solution: Assign the responsibility to an object representing one of the following:

  • Represents the overall "system", a "root object", a device that the software is running within, or a major subsystem

  • Represents a use case scenario within which the system operation occurs

Блабая ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ (Π·Π°Ρ†Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅) ΠΈΠ»ΠΈ Low Coupling

Name: Low Coupling Problem: How to reduce the impact of change? Solution: Assign responsibilities so that unnecessary coupling remains low. Use this principle to evaluate alternatives.

Высокая ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ (High Cohesion)

High Cohesion ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ мСньшС Π½Π΅ спСцифичных для Π½Π΅Π³ΠΎ Π·Π°Π΄Π°Ρ‡, ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ примСнСния. Волько с ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ балансировки ΠΌΠ΅ΠΆΠ΄Ρƒ High Cohesion ΠΈ Low Coupling. считаСтся Ρ‡Ρ‚ΠΎ Low Coupling ΠΈ High Cohesion) это инь ΠΈ янь проСктирования ПО. НСкоррСктноС юзаниС High Cohesion ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Low Coupling ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.

Name: High Cohesion Problem: How to keep objects focused, understandable, and manageable, and as a side effect, support Low Coupling? Solution: Assign responsibilities so that cohesion remains high. Use this to evaluate alternatives.

Чистая Π²Ρ‹Π΄ΡƒΠΌΠΊΠ° (Pure Fabrication)

Pure Fabrication ΠΈΠ»ΠΈ чистая Π²Ρ‹Π΄ΡƒΠΌΠΊΠ°, ΠΈΠ»ΠΈ чистоС синтСзированиС. Π—Π΄Π΅ΡΡŒ ΡΡƒΡ‚ΡŒ Π² Π²Ρ‹Π΄ΡƒΠΌΠ°Π½Π½ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅. Аналогом ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ шаблон Service (сСрвис) Π² ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ΅ DDD.

ΠšΠ°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Pure Fabrication?

  • Π£ΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π·Π°Ρ†Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ ( Low Coupling);

  • ΠŸΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ (High Cohesion) ;

  • Π£ΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС ΠΊΠΎΠ΄Π°.

НС совсСм понятно?

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ всС станСт Π½Π° свои мСста ^_^

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Customer ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ экспСрт Π²Ρ‹ Π½Π°Π΄Π΅Π»ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈ Π²Ρ‹ΡˆΠ΅, ΠΊΠ°ΠΊ Π²Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚Π΅ сохранСниС Customera Π² Π‘Π”?

Π’Π°ΠΊ Π²ΠΎΡ‚ слСдуя Pure Fabrication ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, ΠΌΡ‹ создадим БСрвис ΠΈΠ»ΠΈ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΠΎΡΡ€Π΅Π΄Π½ΠΈΠΊ (Indirection)

Indirection ΠΈΠ»ΠΈ посрСдник. МоТно ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Ρ‚Π°ΠΊΠΈΠΌ вопросом: «Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ сильной связанности ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ΄ΠΈΠ½ класс нуТдаСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅ (сСрвисах), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Π΄Ρ€ΡƒΠ³ΠΎΠΉ класс?Β»

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Ρƒ нас Π±Ρ‹Π» ΠΊΠΎΠ΄:

 public class CustomerOrdersController : Controller
    {
        private readonly IOrdersService _ordersService;

        public CustomerOrdersController(IOrdersService ordersService)
        {
            this._ordersService = ordersService;
        }
    }

ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ этот ΠΊΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ mediator для связки ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ:

public class CustomerOrdersController : Controller
{
	private readonly IMediator _mediator;

	public CustomerOrdersController(IMediator mediator)
	{
		this._mediator = mediator;
	}

	public async Task<IActionResult> AddCustomerOrder(
		[FromRoute]Guid customerId, 
		[FromBody]CustomerOrderRequest request)
	{
	   await _mediator.Send(new AddCustomerOrderCommand(customerId, request.Products));

	   return Created(string.Empty, null);
	}
}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. ΠŸΠΎΡΡ€Π΅Π΄Π½ΠΈΠΊ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ "low coupling", Π½ΠΎ сниТаСт Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ всСй систСмы. Π’Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊΠΎΠΉ класс ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ· опрСдСлСния Controller. Π­Ρ‚ΠΎ компромисс.

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (Polymorphism)

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ позволяСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, позволяя Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ классам Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ дСйствия ΠΏΡ€ΠΈ ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ Π²Ρ‹Π·ΠΎΠ²Π΅. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ классов Square ΠΈ Circle ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ(Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ render) ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ нСсмотря Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Π° подклассы Shape, ΠΌΠ΅Ρ‚ΠΎΠ΄ render ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Shape. (Overriding).

Π£ΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΊ измСнСниям (Protected Variations)

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Как ΡΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, подсистСмы ΠΈ систСмы Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ измСнСния ΠΈΠ»ΠΈ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ этих элСмСнтов Π½Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ влияния Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты?

РСшСниС: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ измСнСния ΠΈΠ»ΠΈ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ, распрСдСлитС обязанности ΠΏΠΎ созданию ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ интСрфСйса Π²ΠΎΠΊΡ€ΡƒΠ³ Π½ΠΈΡ….

По мнСнию ΠΌΠ½ΠΎΠ³ΠΈΡ… это самый Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ косвСнно связан с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ GRASP. Π’ настоящСС врСмя ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ качСства ΠΊΠΎΠ΄Π° являСтся простота ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Как Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈ программисты, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ постоянно ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΌΡΡ трСбованиям. Π­Ρ‚ΠΎ Π½Π΅ являСтся Β«nice to haveΒ» Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ - это Β«must-haveΒ» Π² любом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈ наша ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΊ программистов ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² нашСй систСмы это ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ.

Useful links

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅:

Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ сильно связанны, Ρ‚ΠΎ любой ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ измСнСниям Π²ΠΎ всСх связанных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…. А это Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ мноТСство ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Low coupling ΠΊΠ°ΠΊ Ρ€Π°Π· Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄ Π±Ρ‹Π» слабо связан ΠΈ зависСл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ абстракций. Блабая ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅ встрСчаСтся Π² ΠΊΠ°ΠΊ The Dependency Inversion Principle​ (DIP) ΠΈ слабая ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎ сути это рСализация Dependency Injection ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°. Когда ΠΌΡ‹ ΡƒΡ…ΠΎΠ΄ΠΈΠΌ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΈ абстрагируСмся Π½Π° уровнях интСрфСйсов(ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ Π½Π°ΠΌ рСализациями), Ρ‚ΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ Π½Π΅ завязан Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

По сути High Cohesion ΠΎΡ‡Π΅Π½ΡŒ тСсно связанна с Single Responsibility Principle​ (SRP) с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ². High Cohesion получаСтся Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ соблюдСния SRP.

In the contexts of , and , the term service refers to a functionality or a set of software functionalities (such as the retrieval of specified information or the execution of a set of operations) with a purpose that different can reuse for different purposes, together with the policies that should control its usage (based on the identity of the client requesting the service, for example).

РСшСниС: Π²ΠΎΠ·Π»ΠΎΠΆΠΈΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ осущСствлял связь ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ слуТбами, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π½Π΅ Π±Ρ‹Π»ΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ связаны. Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° являСтся ΠΎΡΠ½ΠΎΠ²ΠΎΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΠΌ Π² ООП. Π’ этом контСкстС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ тСсно связан с Π­Ρ‚ΠΎ самый яркий ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°.

MV-ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ для проСктирования Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
SOLID ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ…
SOLID
software architecture
service-orientation
service-oriented architecture
software
clients
GoF ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° ΠΌΠ΅Π΄ΠΈΠ°Ρ‚ΠΎΡ€
GoF ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠΌ strategy.
https://www.youtube.com/watch?v=Kp1nfw0LDXc
Π°Π½Π³Π».
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ
классам
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ
Π‘Π°Π½Π΄Ρ‹ Π§Π΅Ρ‚Ρ‹Ρ€Π΅Ρ