Mam problemy z nauczeniem się pozostawania niezmiennymi głównymi osobami w Scali, z których jedną jest koncepcja klonowania (lub raczej wywodzenia) z przedmiotowego obiektu.Niezmienne klasy i cechy?
Jednym z tych problemów jest koncepcja mieszana w cechach - przykład
trait helper //modifies some kind behavior.. assume we want to to continue down the line
class A (val x:int) {
def add(y:int) = new A(x + y)
}
Example extends App {
val a =new A(5) with helper
val b = a.add(10) // mixed trait disappears
}
Teraz jest to po prostu bardzo prosta wersja bardziej złożony problem miałem już zbudowany dzisiaj wokół różnych klas, metod fabryki do ukrycia klasa A itd. Jeśli mamy do czynienia tylko z jedną cechą, wiem, że mógłbym po prostu przetestować i przesłać ją w razie potrzeby. Ale co do cholery robię, jeśli w górę z 3 lub więcej cech może istnieć? Musiałbym przetestować wszystkie kombinacje, które są nierealne.
W jaki sposób tworzysz (klonujesz) istniejący obiekt o różnych cechach i/lub modyfikujesz pewien jego aspekt, jednocześnie zachowując zasady projektowania funkcjonalnego?
Dziękujemy, - Tim
Okazuje się, że wcale nie jest to proste! Jest to jeden z głównych powodów, dla których staram się unikać schematu tortowego - ponowne tworzenie tego samego ciasta jest naprawdę trudne, szczególnie jeśli budujesz ciasto w locie. Generalnie łatwiej jest, jeśli rzeczą, która modyfikuje zachowanie, są dane (np. 'Val' w klasie, prawdopodobnie w konstruktorze). –
Zgadzam się i niestety, dlaczego wciąż unikam wzoru dekoracyjnego cechy ... wygląda świetnie w książce, ale książki akademickie nigdy nie opisują jak klonować obiekt później, jak to tutaj opisałem. – LaloInDublin
Po prostu musisz stworzyć konstruktora dla obiektu, który dodaje kolejne trzy lub cztery linie tablicy podstawowej (kiedy to robię) za każdym razem, gdy chcesz mieszać w cechę. Czasami wciąż warto. Często tak nie jest. –