Giriş
Bu yöntemde çoğunlukla A nesnesine C'ye erişim için yeni metodlar ekleniyor. Açıklaması şöyle
Instead, give clients restricted access to operations on the collection through messages that you implement. (Smalltalk Best Practice Patterns, Kent Beck)Instead, offer methods that provide limited, meaningful access to the information in the collections. (Implementation Patterns, Kent Beck)
Örnek
Şu kod yerinea.getB().getItems()
Şöyle yaparız.class A {
private B b;
void doSomething() {
b.update();
}
Items getItems() {
return b.getItems();
}
}
Şöyle kodlarız.
Reservation->Show->Rows->Seats sınıfların erişmek yerine
Örnek
a.getItems()
Örnek Reservation->Show->Rows->Seats sınıfların erişmek yerine
int selectedRow =...;
int selectedSeat = ...;
if (show.getRows().get(selectedRow).getSeats().get(selectedSeat)
.getReservationStatus()) {
{...}
Şöyle yaparız.int selectedRow = ...;
int selectedSeat = ...;
if (show.isSeatReserved(selectedRow, selectedSeat)) {...}
Şöyle yaparız
public class Order {
private final MutableList<LineItem> lineItems = Lists.mutable.empty();
public Order addLineItem(String name, double value) {
this.lineItems.add(new LineItem(name, value));
return this;
}
public void forEachLineItem(Procedure<LineItem> procedure) {
this.lineItems.forEach(procedure);
}
public int totalLineItemCount() {
return this.lineItems.size();
}
public int countOfLineItem(String name) {
return this.lineItems.count(lineItem -> lineItem.name().equals(name));
}
public double totalOrderValue() {
return this.lineItems.sumOfDouble(LineItem::value);
}
}
public record LineItem(String name, double value) {}
1. Yeni bir SynchronizedOrder yazmak
2. lineItems nesnesini synchronized hale getirmek
3. CopyOnWrite yöntemini kullanmak
Bu durumda kod şöyle olur
public record Order(ImmutableBag<LineItem> lineItems) {
public Order() {
this(Bags.immutable.empty());
}
public Order addLineItem(String name, double value) {
return new Order(lineItems.newWith(new LineItem(name, value)));
}
public double totalOrderValue() {
return this.lineItems.sumOfDouble(LineItem::value);
}
}
public record LineItem(String name, double value) {}
Hiç yorum yok:
Yorum Gönder