Jak nazwać funkcję podmieniającą całość na podzbiór?

0
somekind napisał(a):

Widzę, że fani serialu ciągle czekają na kolejne odcinki. ;)

@TomRiddle - tylko zastanów się, czy ktoś widzący kod po raz pierwszy na oczy, domyśli się po nazwie retain albo isolated co dana funkcja robi. Bo jak dla mnie, to te nazwy są równie wiele mówiące, co notHotDog. ;)

True, celna uwaga. Ale nie mogę jej nazwać removeAllExcept(), bo to brzmi jak hiper-wysokopoziomows funkcja która robi nie wiadomo co.

0

Żebym ja też miał 7 stron wątku na temat mojego code review :D

1
somekind napisał(a):

Widzę, że fani serialu ciągle czekają na kolejne odcinki. ;)

@TomRiddle - tylko zastanów się, czy ktoś widzący kod po raz pierwszy na oczy, domyśli się po nazwie retain albo isolated co dana funkcja robi. Bo jak dla mnie, to te nazwy są równie wiele mówiące, co notHotDog. ;)

Nazwałem ją substitute().

2

Dzięki za aktualizację. Dobrze że skończyło się bez cliff hangera : - )

3

@TomRiddle:

Nazwałem ją substitute().

o ja pierdziu - 7 stron :o
w ogóle taka funkcja nie powinna istnieć, funkcje powinny być prawie zawsze pure i nic nie powinna podmieniać tylko zwracać nowy obiekt a o starym możesz ewentualnie zapomnieć. Zamieniając słowo "podmienić" na "wyciągnąć"

Funkcja wyciągająca pojedynczą klatkę z filmu - extract?
Funkcja wyciągająca jedno zdanie z postu. - extract
Funkcja wyciągająca jedną literę ze słowa. - extract
Funkcja wyciągająca jeden obiekt ze sceny 3d - extract / pick / find?
Funkcja wyciągająca jeden plik z folderu - ?? find?
Funkcja wyciągająca folder z archiwum - odpowiedź jest w programach do dekompresji - extract
Funkcja wyciągająca wycinek obrazka - tu jednak crop
Funkcja wyciągająca 2 ze 123 - nie rozumiem tego przykładu
Funckja wyciągająca jedno zwierze z farmy - extract / pick / find

substitute to podmienić, ale w sensie zamiennikiem, sugeruje że nowy obiekt można użyć w miejscu starego co prawdopodobnie nie jest prawdą
7 stron i wybrałeś "substitute"...

0
obscurity napisał(a):

w ogóle taka funkcja nie powinna istnieć, funkcje powinny być prawie zawsze pure i nic nie powinna podmieniać tylko zwracać nowy obiekt a o starym możesz ewentualnie zapomnieć.

I dokładnie taka moja funkcja jest. Zwraca kompletnie nowy obiekt, tylko że z lekko zmienionym "wnętrzem". Nie wiem skąd ten pomysł że zrobiłbym nie immutable obiekty.

Funkcja wyciągająca pojedynczą klatkę z filmu - extract?
Funkcja wyciągająca jedno zdanie z postu. - extract
Funkcja wyciągająca jedną literę ze słowa. - extract
Funkcja wyciągająca jeden obiekt ze sceny 3d - extract / pick / find?
Funkcja wyciągająca jeden plik z folderu - ?? find?
Funkcja wyciągająca folder z archiwum - odpowiedź jest w programach do dekompresji - extract
Funkcja wyciągająca wycinek obrazka - tu jednak crop
Funkcja wyciągająca 2 ze 123 - nie rozumiem tego przykładu
Funckja wyciągająca jedno zwierze z farmy - extract / pick / find

To teraz znajdź jedno wspólne słowo na te wszystkie przypadki ;)

substitute to podmienić, ale w sensie zamiennikiem, sugeruje że nowy obiekt można użyć w miejscu starego co prawdopodobnie nie jest prawdą

No i to dokładnie robi moja funkcja. Podmienia cały obiekt jego elementem. I w moim przypadku, nowy obiekt dokładnie można użyć w miejscu starego ;)

0

Czy możesz przedstawić sygnaturę tej funkcji? Typy argumentów, generyki (ograniczenia).
Najlepiej w notacji haskellowej, ale coś jak Java/C#/Scala/TS/Kotlin też będzie ok.

(pamiętam, że miałem nie czytać tego wątku, ale ta strona wygląda ok)

0
jarekr000000 napisał(a):

Czy możesz przedstawić sygnaturę tej funkcji? Typy argumentów, generyki (ograniczenia).
Najlepiej w notacji haskellowej, ale coś jak Java/C#/Scala/TS/Kotlin też będzie ok.

interface Entity {
}

interface Builder {
  A substitute(Entity entity); // tej nazwy szukałem
}

class A {
  List<Entity> getEntities();
  Builder forEntity(Filter<x> jakiśFilterNieIstotne);
}

class B implements Entity {
}

class C implements Entity {
}

a use-case:

Entity c = new C();
Entity b = new B(new Entity(), c, new Entity());
A a = new A(b);

A cleanA1 = a.forEntity(x).substitute(c); // "x" to jakiś predykat, wyciągnie b
A cleanA2 = new A(c);

Dwie ostatnie linijki powinny mieć taki sam efekt.

cleanA1.getEntities(); // [c];
cleanA2.getEntities(); // [c];

Innymi słowy, dostaję new A(new B(new C())), i chcę użyć takiej funkcji na tym, żebym dostał new A(new C()).

0

Trochę zgaduję że masz immutable strukturę w stylu drzewka i chcesz ją przetransformować (transform), przekonwertować (convert) lub zredagować (redact) podmieniając jakiś węzeł (replace) na inny zachowując resztę struktury. Częstym rozwiązaniem jest zrobienie wizytatora który odwiedzi wszystkie elementy i zwróci nowy lub stary węzeł w zależności od warunku. W C# masz przykładowo ReplacingExpressionVisitor do przepisywania wyrażeń które są immutable - wtedy piszesz tylko wizytator który łączy Twoje "forEntity" i "substitute" w proste wyrażenie które może być lambdą typu:

x => x is B ? c : x

i potem tylko wykonujesz ReplacingVisitor.Execute(a) i dostajesz co chciałeś. Tu masz kod ReplacingExpressionVisitora z EF Core https://github.com/dotnet/efc[...]ReplacingExpressionVisitor.cs może coś natchnie
i jakiś artykuł https://www.lihaoyi.com/post/[...]ingwiththeVisitorPattern.html

0
TomRiddle napisał(a):

..
Innymi słowy, dostaję new A(new B(new C())), i chcę użyć takiej funkcji na tym, żebym dostał new A(new C()).
...

Hmm, czyli dostajesz obiekt i wypruwasz z niego stan wewnętrzny, żeby coś później z tym stanem wewnętrzny zrobić?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0