solid-principlesAan de slag met solide principes


Opmerkingen

Deze sectie geeft een overzicht van wat solide principes zijn en waarom een ontwikkelaar het misschien wil gebruiken.

Het moet ook alle grote onderwerpen binnen solide principes vermelden en een link naar de gerelateerde onderwerpen. Aangezien de Documentatie voor solide principes nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

Installatie of instellingen

U kunt elke IDE- en OOP-taal gebruiken om SOLID Principles te implementeren. In de voorbeeldcode heb ik C # gebruikt omdat dit de meest gebruikte taal is in .NET-woord en sterk lijkt op Java en C ++.

Liskov-vervangingsprincipe


Waarom LSP gebruiken?

Scenario: stel dat we 3 databases (klanten van hypotheken, klanten met een lopende rekening en klanten van een spaarrekening) hebben die klantgegevens verstrekken en dat we klantgegevens nodig hebben voor de achternaam van de klant. Nu kunnen we meer dan 1 klantendetail krijgen van die 3 databases tegen de opgegeven achternaam.


Implementatie

BEDRIJFSMODEL LAAG:

public class Customer
{
    // customer detail properties...
}
 

DATA TOEGANGSLAG:

public interface IDataAccess
{
    Customer GetDetails(string lastName);
}
 

Bovenstaande interface wordt geïmplementeerd door de abstracte klasse

public abstract class BaseDataAccess : IDataAccess
{
    /// <summary> Enterprise library data block Database object. </summary>
    public Database Database;    
    public Customer GetDetails(string lastName)
    {
        // use the database object to call the stored procedure to retirve the customer detials
    }
}
 

Deze abstracte klasse heeft een gemeenschappelijke methode "GetDetails" voor alle 3 databases die wordt uitgebreid met elk van de databaseklassen zoals hieronder wordt getoond

TOEGANG TOT DE HYPOTHEEKGEGEVENS:

public class MortgageCustomerDataAccess : BaseDataAccess
{
    public MortgageCustomerDataAccess(IDatabaseFactory factory)
    {
        this.Database = factory.GetMortgageCustomerDatabase();
    }
}
 

HUIDIGE ACCOUNT TOEGANG KLANTGEGEVENS:

public class CurrentAccountCustomerDataAccess : BaseDataAccess
{
    public CurrentAccountCustomerDataAccess(IDatabaseFactory factory)
    {
        this.Database = factory.GetCurrentAccountCustomerDatabase();
    }
}
 

BESPAAR ACCOUNT KLANTGEGEVENS TOEGANG:

public class SavingsAccountCustomerDataAccess : BaseDataAccess
{
    public SavingsAccountCustomerDataAccess(IDatabaseFactory factory)
    {
        this.Database = factory.GetSavingsAccountCustomerDatabase();
    }
}
 

Zodra deze 3 gegevenstoegangsklassen zijn ingesteld, vestigen we onze aandacht op de klant. In de bedrijfslaag hebben we de klasse CustomerServiceManager die de detials van de klant aan zijn klanten retourneert.


BEDRIJFSLAAG:

public class CustomerServiceManager : ICustomerServiceManager, BaseServiceManager
{
   public IEnumerable<Customer> GetCustomerDetails(string lastName)
   {
        IEnumerable<IDataAccess> dataAccess = new List<IDataAccess>()
        {
            new MortgageCustomerDataAccess(new DatabaseFactory()), 
            new CurrentAccountCustomerDataAccess(new DatabaseFactory()),
            new SavingsAccountCustomerDataAccess(new DatabaseFactory())
        };

        IList<Customer> customers = new List<Customer>();

       foreach (IDataAccess nextDataAccess in dataAccess)
       {
            Customer customerDetail = nextDataAccess.GetDetails(lastName);
            customers.Add(customerDetail);
       }

        return customers;
   }
}
 

Ik heb de Dependency Injection niet getoond om het simpel te houden omdat het nu al ingewikkeld wordt.

Als we nu een nieuwe klantendatabase hebben, kunnen we gewoon een nieuwe klasse toevoegen die BaseDataAccess uitbreidt en het databaseobject levert.

Natuurlijk hebben we identieke opgeslagen procedures nodig in alle deelnemende databases.

Ten slotte zal de client voor CustomerServiceManagerclass alleen de methode GetCustomerDetails aanroepen, de achternaam doorgeven en zich geen zorgen maken over hoe en waar de gegevens vandaan komen.

Ik hoop dat dit je een praktische benadering geeft om LSP te begrijpen.