GRASP

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, Ρ‚ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… систСмных сообщСний.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅: MV-ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ для проСктирования Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

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

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

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

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.

In the contexts of software architecture, service-orientation and service-oriented architecture, the term service refers to a software 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 clients 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).

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

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

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

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

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

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

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

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

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

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

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

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

 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).

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

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

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

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

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

Last updated

Was this helpful?