Desain unit yang efisien. Simulasi unit tunggal

Artikel ini adalah sinopsis Desain Agregat Efektif Bagian I: Memodelkan Agregat Tunggal .





Menggabungkan entitas dan objek nilai menjadi suatu agregat dengan batas-batas konsistensi yang dipikirkan dengan cermat mungkin tampak sederhana, tetapi dari semua pola DDD taktis, agregat adalah salah satu yang paling kompleks.





Akan sangat membantu untuk memulai dengan beberapa pertanyaan umum. Apakah agregat hanyalah cara untuk menggabungkan objek yang terkait erat dengan akar yang sama (Akar Agregat)? Jika ya, apakah ada batasan jumlah objek yang dapat berada dalam grafik? Karena satu agregat dapat merujuk ke agregat lain, apakah mungkin untuk menavigasi agregat menggunakan tautan ini dan mengubah data objek yang termasuk dalam agregat tertentu? Dan apa yang invariant dan konsistensi limit ? Jawaban atas pertanyaan terakhir sangat memengaruhi jawaban lainnya.





Ada banyak cara untuk memodelkan rakitan dengan tidak benar. Kita bisa mendesain unit yang terlalu besar. Di sisi lain, kita dapat membagi semua agregat sedemikian rupa sehingga sebagai akibatnya invarian yang sebenarnya dilanggar. Seperti yang akan kita lihat, sangat penting untuk menghindari hal-hal ekstrem tersebut dan sebagai gantinya memperhatikan aturan bisnis.





Pengembangan Aplikasi ProjectOvation

Mari kita lihat agregat dengan sebuah contoh. Perusahaan fiktif kami sedang mengembangkan aplikasi untuk mendukung proyek berdasarkan metodologi Scrum. Aplikasi ini mengikuti model manajemen proyek Scrum tradisional, yaitu, ada produk (produk), pemilik produk (pemilik produk), tim (tim), item backlog (item backlog), rilis yang direncanakan (rilis yang direncanakan), sprint ( sprint). Terminologi scrum membentuk titik awal dari bahasa yang ada di mana-mana. Setiap organisasi yang membeli langganan mendaftarkan dirinya sebagai penyewa, istilah lain untuk bahasa umum kita .





. , DDD . , , DDD . , . , .





? . , . . :





  • , .





  • .





  • .





  • .





  • .





  • .





. , .





:

ยซ ยป . , , . :





  • , .





  • , .





  • , .





  • , .





Product . , Product, BacklogItem, Release, Sprint , . . UML- .





public class Product extends ConcurrencySafeEntity {

    private Set<BacklogItem> backlogItems;
    private String description;
    private String name;
    private ProductId productId;
    private Set<Release> releases;
    private Set<Sprint> sprints;
    private TenantId tenantId;
    ...

}

      
      



Angka:  1. Produk dimodelkan sebagai rakitan yang sangat besar.
. 1. Product .

, - . , .  , . , , . () , .





:





  • , , Product c 1 .





  • BacklogItem . 2.





  • Release , , Product 1.





. .





. , . . .





. ? , -. , . , .





:

, 2. . ProductId, Product-.





Angka:  2. Produk dan konsep terkait dimodelkan sebagai agregat terpisah.
. 2. Product .

Product. :





public class Product ... {
    	...
      public void planBacklogItem(
        String aSummary, String aCategory,
        BacklogItemType aType, StoryPoints aStoryPoints) {
      		...
      }
    	...
      public void scheduleRelease(
        String aName, String aDescription,
        Date aBegins, Date anEnds) {
      		...
      }

      public void scheduleSprint(
        String aName, String aGoals,
        Date aBegins, Date anEnds) {
        	...
      }
      ...
}

      
      



. Product, , โ€“ void. :





public class Product ... {
    	...
      public BacklogItem planBacklogItem(
        String aSummary, String aCategory,
        BacklogItemType aType, StoryPoints aStoryPoints) {
      		...
      }
  
      public Release scheduleRelease(
        String aName, String aDescription,
        Date aBegins, Date anEnds) {
        	...
      }

      public Sprint scheduleSprint(
        String aName, String aGoals,
        Date aBegins, Date anEnds) {
        	...
      }
      ...
}

      
      



. . , , :





public class ProductBacklogItemService ... {
     ...
     @Transactional
     public void planProductBacklogItem(
           String aTenantId, String aProductId,
           String aSummary, String aCategory,
           String aBacklogItemType, String aStoryPoints) {

           Product product =
                   productRepository.productOfId(
                                 new TenantId(aTenantId),
                                new ProductId(aProductId));

           BacklogItem plannedBacklogItem =
                  product.planBacklogItem(
                            aSummary,
                            aCategory,
                            BacklogItemType.valueOf(aBacklogItemType),
                            StoryPoints.valueOf(aStoryPoints));
          
          backlogItemRepository.add(plannedBacklogItem);
      }
      ...
}

      
      



, . BacklogItem, Release Sprint .





. , , . , , , - . , , .





, . , .





โ€” -, . . , . . . :





c = a + b

, , = 2 b = 3, 5. , 5, . , , .





AggregateType1 {
    int a; int b; int c;
    operations...
}

      
      



, , , - , . , , . , .





. , , . โ€“ , , , , . .





( ) . .





, , , . , . . . , , .





: ? , , . , , , , , . - , .





, , ? , (lazy loading). , . , , . , . , , . , .





, 3. 0..* . . , . . , , . .





Angka:  3. Model produk.  Beberapa koleksi besar dimuat selama banyak operasi sederhana.
. 3. Product. .

. , , .





, , ยซยป. , , , . , (root entity), / (object value).





, (, ) ? : , . , Product name description. , . , , . -, .





, , , . , , . , , , . , . . - , .





. , . , . , . Order OrderItem . , - , . , .





, , . . , , , .





, . , - . , . , . , , .





, -, , - , . 4. , , , . . , . , , , -.





Angka:  4. Menunjukkan akses bersamaan ke data antara tiga pengguna.  Mereka mencoba mengakses dua contoh agregat yang sama, yang mengakibatkan sejumlah besar kegagalan transaksi.
. 4. . , .

, , . , , . ?





, , , , . - (eventual consistency) . , , , . , , . . , .








All Articles