oソフトウェアは、Financeiros、マーティンFowler、アンクルボブEアレクサンダーハミルトンT M M Mコム?

19414 ワード

エンタープライズアプリケーションアーキテクチャのcomo disse Martin fowler no artigo sobreパターン

"Uma boa parte dos computadores neste mundo manipula dinheiro, então sempre me intrigou que Money não seja um tipo de dados em qualquer linguagem de programação convencional."


https://martinfowler.com/eaaCatalog/money.html):
BOMは、企業のアプリケーションアーキテクチャのEUÑo oのパターンは、MAS SEI que El Sugereは、実装者の残高Oデデマスタークラッセのお金は、COMのアトリエの通貨の量は、Beam como umのmのtodoを割り当てます.NesseアーティゴーVou Mostrar comoの実装のnossoマネーpraのリゾルバumの問題の実de perdaデcentavos em rateio、becomoリゾルバoミストes rio do t tulo.
J . t . t nhamos uma classe money , o que facou muito na escritaはマネーパターンを行う.ENTは、o o se eu puderターAを前払いします.Construa seu valueオブジェクト.デポスデターワレスは、Financeiros Esppalhados por todo seu sistema、vai ser bem difを口外します.
NSSA Classse Money N ' s o To O O Atbuto Currency Pois N ' s o Temos A Internationionioniza Splialo - O , Pero Menos n - Astro O Aindaの必要性E ' n ' o o vo - vamos - terの実装者は、通貨の単位である.アッシムcomo Tamb m m n o o tはnhamos o mをtodo割り当てます.プリプリモス.Portanto Nosso Money era Asym :
public class Money implements Serializable {

  private final BigDecimal amount;

  private Money(BigDecimal amount) {
    if (amount == null) {
      throw new AmountCantBeEmptyException();
    }
    this.amount = amount;
  }

  public static Money of(BigDecimal amount) {
    return new Money(amount);
  }

  public Money plus(Money addition) {
    return Money.of(this.amount.add(addition.amount));
  }

  public Money minus(Money discount) {
    return Money.of(this.amount.subtract(discount.amount));
  }

  public Money times(BigDecimal factor) {
    return Money.of(this.amount.multiply(factor));
  }

  public BigDecimal getAmount() {
    return amount;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == null || !(obj instanceof Money)) {
      return false;
    }
    return this.amount.compareTo(((Money) obj).amount) == 0;
  }

  @Override
  public int hashCode() {
    return this.amount.hashCode();
  }

}
Isoso Resolvia Boa Party Das Nossos問題ペイディオスでは、ディオディ・エム・エック・プレイサモスがchegouを割り当てる.『十五〇〇〇〇〇〇〇〇〇〇〇〇〇, 20デヴェリア・セール・ラータダ』第五巻

コモpodem perceber、se aplicarmos o percenarmos o prenorは、第2のカタルーニャエムr r $ 1000、20 - isso porque centavoをします.Se Aredondarmos pra baixo、「perdemos」3 centavos.Se Antidondarmos praシマ、「ganhamos」2 centavos.Eのノートでは、半円でも、ペルーの前半分、ペデモスプレサプリメントは、O .エッセのLimo o o o o o o o o d o d o d o d o d o d o d o d o d o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o d o d o d o d d d o d o o o o o o o o o o o o o o o o o o o o o d o d o d o d o d o d o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o
E . sabem quem enfrentou um問題は、parecido?エレメッモ、ジョージワシントン、O primeiro大統領は、Dos estadosユニドス、Eの馬ダスsoluのseをpropostas foiデアレクサンダーハミルトン、que veio a ser o primeiro秘密のええ、リオo teouroドスeua、e seu最大剰余法.
Poca時代における問題点とその問題点
午前3時00分、4つのEstados、COM Diferentesポピュラは、Cesエステを食べます.Quantos Senadores Cada Estado Teria para que Eles Fossem Representados Plassicionmenteミュンセナドール、アッシムcomo um centavo、tamb m m n o o pode ser dividido em partes.セトー?と主張しているディー

Oは、トドデハミルトン一貫してエムCalcular A Proporを得ますda daポピュラー語は、合計11882ペラQuantidadeデ20のAsendtosディプロンヌヴェルChangandoなし除数デ594 , 1を合計します.アゴラpra cadaエストラードは、se sua popula巣をo o porエッセ除数、por典型的なエストラード1 2560/594、1 chegando no quociente de 4 , 31です.
como jは、concordamos、nはo o o o oポデロゼter 4 senadores e 0、31 um senador para um estado.耳鼻咽喉科は、エストラド1、4、queを1つにする.E isso aconteceパラシュートで降下する人cdaは、Dos outros結果です.AO最終的な、PorコンタDas逮捕されたda Parte inteira、oデデsenadoresアロカドスNOS estadosは、de 18です.pra quais estados v . o o os outros 2 .つのAmerican Paraos que Ficaram com a maor parte decimal antesは、逮捕されます.
探検する.SE Suprimirmos Parte Inteira da coluna senadores por estado e ordenarmos pela parte decimal , o resto , em ordem decrescente , ficarエーモスcom :
  • 1 , 67
  • 5、58
  • 8 , 44
  • 4 , 31
  • como temos um合計2 2つのsenadores pra再分配、os estados que relebemは、senadores s o o o o os 2の2つのprimeiros da listaです.resultando na coluna senadores porエストラードapはs tomハミルトンをtodoします.
    オウムパラドックスa se Noar que foi descoberto ao aplicar o m o todoハミルトンna populaは、o alalama、por isso tambにmを与えます.NOSSO CeriidoアンクルボブノーアーゴのMa . es onde entra.
    suasの中でsuasを取り込んでください.カラデ90歳のリレーバンテl ' d d ' dカエデde 90、それに関連するhoje.O王女はピオque iRemosフォーサーアゴラOオープンオープン原則.
    Preasisamosの異形のNassa Classe Money para Comportar o m To Todoは、pra conseguirディストリビューションseu valor em - proo - origin - es sem perder centavosを割り当てます.クレモロスOセグィンテMトートード
    public class Money implements Serializable {
      private static final BigDecimal ONE_HUNDRED = new BigDecimal(100);
    
      public List<Money> allocate(List<BigDecimal> ratios, RemainderDistribution distribution) {
        long amountInCents = toCents();
        List<Quota> quotas = new ArrayList<>();
        for (BigDecimal ratio: ratios) {
          quotas.add(new Quota(amountInCents, ratio));
        }
        distribution.distribute(quotas, amountInCents);
        return quotas.stream().map(Quota::toMoney).collect(Collectors.toList());
      }
    
      public long toCents() {
        return this.amount.multiply(ONE_HUNDRED).longValue();
      }
    }
    
    public class Quota {
      private static final BigDecimal ONE_HUNDRED = new BigDecimal(100);
    
      private long amount;
      private long total;
      private BigDecimal ratio;
    
      public Quota(long total, BigDecimal ratio) {
        this.total = total;
        this.ratio = ratio;
        this.amount = ratio.multiply(BigDecimal.valueOf(total)).longValue();
      }
    }
    
    public interface RemainderDistribution {
      void distribute(List<Quota> quotas, long total);
    }
    
    Lambraは、パラダコにアラバマをします?Mesmo tendo Validado com nososoプロダクトマネージャーque adotarは、エーモスo mをtodoデハミルトンアイダナTemos dを得ます.エントは、O o n ' o o '王o '王エーモス「chumbar」分配私は、o o c c ' digo金をします.エーモスDaixar Nosso Value Object Aberto PIA Extensionsを使用します.UMA Das Suasの実装についての一考察
    public class HamiltonApportionmentDistribution implements RemainderDistribution {
    
      @Override
      public void distribute(List<Quota> quotas, long total) {
        long remain = total;
        for (Quota quota : quotas) {
          remain = remain - quota.getAmount();
        }
        List<Quota> sortedQuotas = quotas.stream().sorted(Comparator.comparing(Quota::getFractionalPart).reversed()).collect(Collectors.toList());
        Iterator<Quota> iterator = sortedQuotas.iterator();
        while(remain > 0) {
          remain = remain - 1;
          iterator.next().addRemain(1);
        }
      }
    
    }
    
    デッサManeiraレゾルモスAcreeleの問題は、インディオ、ondeの逮捕されたpra baixo「perdは、エーモス」3 centavos(Lembre se que o逮捕されたpra baixo es porコンタDos Centavos、類似したquando「逮捕します」).o c c lulo deve ser feitoは、Medida、ou seja、centavosのmenor unidadeを使用します.E . Cheegamosのseguinte結果
    NBR 5891
    アレクサンダーハミルトン、マーティンFowler EおじボブCOS OS Sesemas Financeirosを追ってください.E、デQuebra、vocは、Ganha uns cを得ます.ああ、トドエッセcはdioのfooコベットpor testes単位でrios.Na Primeira Pessoaが複数にするので、e Saabe QuandoアレンポルノDesenvolvemosエサsoluは、oのemを3つ、entのoをtodo o crのo dito tambのm ao e e .valeu、時間!
    Bは、NUS:praサーベルクェー・フォー・アレクサンダー・ハミルトン、existe um音楽的なdisponを引きます.Cona Aは、RIA desse que foi o primeiro秘密の味方をします.Segueトレーラーdesseミュージカルfant