13

Aprill

Iluvõtted koodile II

Marek Tihkan

Loodetavasti on kõht nüüd brokkoli parajasti täis ja kood ilustatud laiendusmeetoditega, mida käsitlesin eelmise artiklis. Teiseks lihtsaks võtteks on tagastada kogu objekt meetoditel. See ei ole midagi keerulisemat kui kirjutada kaks sõna:

return this;

Võib kerkida küsimus, et kus neid kasutada, kui on klassides defineeritud ainult atribuudid (property) ja paar üksikut meetodit. Nii ei ole võimalik seda väga lihtsalt rakendada.

public class Product
{
  public StockKeepingUnit SKU { get; set; }
  public ProductName Name { get; set; }
  public Money Price { get; set; }
  public Party Vendor { get; set; }
}

var product = new Product
{
  SKU = new StockKeepingUnit(“PRO-2345”),
  ProductName = new ProductName(“Goldstein Elite Blue Pen”),
  Price = new Money(10m, Currency.EEK),
  Vendor = new Organization(“ABC Company”)
};

Defineerides paar meetodit võiksime selle klassi saada järgmiseks:

public class Product
{
  public StockKeepingUnit SKU { get; protected set; }
  public ProductName Name { get; protected set; }
  public Money Price { get; protected set; }
  public Party Vendor { get; protected set; }

  public Product Named(string name)
  {
    Name = new ProductName(name);
    return this;
  }

  public Product SerializedAs(string serial)
  {
    SKU = new StockKeepingUnit(serial);
    return this;
  }

  public Product Priced(decimal amount, Currency currency)
  {
    Price = new Money(amount, currency);
    return this;
  }

  public Product ProducedBy(string name)
  {
    Vendor = new Organization(name);
    return this;
  }
}

var product = new Product()
  .Named(“Goldstein Elite Blue Pen”)
  .SerializedAs(“PRO-2345”)
  .Priced(10m, Currency.EEK)
  .ProducedBy(“ABC Company”);

Ilmselt panite tähele, et uues koodis on rohkem koodi. Samas see tundub loetavam ja peamiselt tegeleme primitiivtüüpidega.

Esmapilgul võib tunduda, et Object-Relational Mappertite (ORM) osas võib tekkida probleeme, kuid NHibernate tingimused tunduvad täidetud olevat (protected setterid on olemas). Seevastu teisendamine objektist objektiks võib veidi probleemsem olla. Olemist (entity) transpordiobjektist (Data Transfer Object, DTO) ei tohiks probleemne olla, kuid vastupidine on juba keerulisem. Mulle tundub, et see ongi hea – see sunnib meid mõtlema veidi teisiti, muudatused olemis peaksid olema ärilise üksusena, mitte nagu tänapäeva tabelipõhised haldamised.

Liideste abiga on meil veel võimalik kitsendada valikuid ja sundida kindla jada läbima.

public IProductNamingExpression Named(string name)
{
  //...
  return this;
}

public interface IProductNamingExpression
{
  Product SerializedAs(string sku);
}

product.Named("Goldstein Elite Pen").SerializedAs("GEP-0001");

Kui leiate, et ei soovi enda ärimudelit nii keerukaks teha, siis on see vägagi sobilik Builder mustri jaoks, kus pika konstruktori argumentide asemele tuleb loetav jutt. See meetod sobib ka väga hästi seadistuste ja registreerimiste jaoks.

Ilusat koodi kirjutamist

Loe veel sarnastel teemadel:

  • Share/Bookmark

KATEGOORIAD » Arendus

SILDID » ,

Lisa kommentaar

  • * Kuvatakse kommentaari juures
  • * Ei publitseerita