Tłumaczenie override method, shadow, hide, etc

Jaki są poprawne tłumaczenia?
override method = nadpisywać metodę, shadow = przesłaniać, hide = ukrywać
80%
80% [4]
override method = nadpisywać metodę, shadow / hide = przesłaniać (tzn bez rozróżniania)
0%
0% [0]
coś innego (napisz w odpowiedzi)
20%
20% [1]
Odpowiedz Nowy wątek
2019-12-02 13:20
1

Myślałem, że tłumaczenie tych słów w kontekście programowania jest jednoznaczne, ale po dyskusji z @somekind wychodzi na to, że nie. Wynurzyłem się ze sprawdzaniem słowników, ale to było przedwczesne, bo słowniki polsko-angielskie często podają wiele tłumaczeń (kilka, czy nawet kilkanaście) dla jednego hasła i w ten sposób można nagiąć tłumaczenie w każdą stronę. Tymczasem w IT potrzebna jest precyzja, więc jeśli ktoś używa słowa "przesłanianie" to powinno to być jednoznaczne.

Tłumaczenie "method overriding" na "nadpisywanie metod" jest np w https://pl.wikipedia.org/wiki/Nadpisywanie_metod i https://pl.wikibooks.org/wiki/C%2B%2B/Funkcje_wirtualne .
Strony https://pl.wikipedia.org/wiki/Przes%C5%82anianie i https://en.wikipedia.org/wiki/Variable_shadowing są w Wikipedii połączone jako wersje językowe, więc to wskazuja na to, że "przesłanianie" to "variable shadowing".
Artykuł https://dzone.com/articles/va[...]-shadowing-and-hiding-in-java jest o tyle fajny, że pokazuje naraz wszystkie 3 rzeczy (method overriding, variable shadowing i variable hiding) i pokazuje między nimi różnice. Jedną z różnic jest to, że nadpisywanie wymaga zgodności sygnatur (metody muszą być override compatible), natomiast przesłanianie czy ukrywanie może wiązać się z zupełną zmianą typu.

Jeśli chodzi o Javę to:

  • przesłonięte (variable shadowing) czy ukryte (variable hiding) pola można odsłonić / odkryć bez uciekania się do refleksji (refleksją można zrobić bardzo dużo rzeczy, więc takie zabawy się nie liczą)
    • odsłanianie jest proste, np w Javowym idiomie z konstruktora this.cośtam = cośtam użyłem this. by odsłonić pole cośtam z obiektu, bo jest zasłonięte parametrem cośtam z konstruktora
    • odkrywanie też jest proste. Jeśli mam class Parent { String x; } oraz class Child extends Parent { int x; } oraz referencję Child ref = ... to mogę zrobić np ((Parent) ref).x = "" + ref.x
  • nadpisywanie metody z klasy Parent w klasie Child oznacza, że do nie mogę na obiekcie klasy Child odpalić implementacji tej metody z klasy Parent. Nie da się w miejscu wywołania metody na obiekcie odwrócić nadpisania.

Jak tłumaczycie te pojęcia sami i z jakimi tłumaczeniami się spotykacie?


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2019-12-02 13:36
0
public class Parent {

    int x = 10;

    void hello() {

        System.out.println("Parent here");
    }
}
public class Child extends Parent {

    int x = 101;

    public static void main(String[] args) {

        Child child = new Child();
        System.out.println("Child : " + child.getChildValue());
        System.out.println("Parent : " + child.getParentValue());

        new Child().foo();
    }

    void hello() {

        System.out.println("Child here");
    }

    private void foo() {

        hello();
        super.hello();
    }

    int getParentValue() {

        return super.x;
    }

    int getChildValue() {

        return x;
    }
}

Child : 101
Parent : 10
Child here
Parent here


"Ktoś sobie uświadomił, że pisał pod pseudonimem rzeczy, które lepiej żeby w firmie nie wypatrzyli :-)"

"- Ledwo na studiach 3 tydzień się kończy i już ciężko?
- Niestety prowadzący jest dziwny i robi kartkówki"
edytowany 2x, ostatnio: BraVolt, 2019-12-02 13:37
Pokaż pozostałe 4 komentarze
No to może inaczej zapytam: co twój kod wnosi do dyskusji? - Wibowit 2019-12-02 14:07
Więcej nie jestem w stanie pomóc, dość dawno miałem i czytałem ostatnią książkę IT po polsku. - BraVolt 2019-12-02 14:07
Zobacz polskie tłumaczenie Horstmana. Tłumaczenie było dobre. Znajdziesz zadowalające odpowiedzi albo nie. - BraVolt 2019-12-02 14:09
Znalazłem stronę tłumacza i nawet jest na niej słownik. Jednak tłumaczenia są dość dziwne. overriding tłumaczy jako przesłanianie: http://shebang.pl/stp/overriding/ a shadowing jako zastępowanie: http://shebang.pl/stp/shadowing . Abstrahując od tłumaczenia, shadowing u niego ma błędną definicję. Nie ma też tłumaczenia dla variable hiding. - Wibowit 2019-12-02 14:17
Pamiętam, że to tłumaczenie było wtedy określane jako dobre. Nic innego co mogłoby posłużyć za w miarę dobry wzór tłumaczeń nie przychodzi mi do głowy. Może jeszcze coś z PWN byłoby dobrze przygotowane? - BraVolt 2019-12-02 14:25

Pozostało 580 znaków

2019-12-02 14:33
2

Ja tam różnicy między shadow a hide w przypadku metod nie widzę.

I generalnie zgadzam się, że tłumaczenie "override" na "nadpisywanie" i rozróżnianie tego od "przesłaniania" ma więcej sensu językowego. Ale spójrzmy na wyniki z pierwszej strony Google:
https://strefainzyniera.pl/artykul/942/przeslanianie-metod
https://1024kb.pl/rekrutacja/[...]rzeciazanie-vs-przeslanianie/
https://skillstest.pl/library/question/123
https://www.samouczekprogrami[...]/dziedziczenie-w-jezyku-java/
http://jsystems.pl/blog/artykul.html?id=25

Wynika z tego, że "nadpisywanie" i "przesłanianie" są powszechnie traktowane jako synonimy. (Być może dlatego, że w Javie chyba nie da się przesłonić/ukryć metody.)


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2019-12-02 14:46
0

I generalnie zgadzam się, że tłumaczenie "override" na "nadpisywanie" i rozróżnianie tego od "przesłaniania" ma więcej sensu językowego. Ale spójrzmy na wyniki z pierwszej strony Google:

"Nadpisywanie metod" daje 103k wyników. "Przesłanianie metod" daje 41k wyników. Może dalego, że jestem za VPNem.

Problem prawdopodobnie zaczął się od kulawego tłumaczenia np książek Caya Horstmanna. Przytoczę to co napisałem w komentarzach:

Znalazłem stronę tłumacza i nawet jest na niej słownik. Jednak tłumaczenia są dość dziwne. overriding tłumaczy jako przesłanianie: http://shebang.pl/stp/overriding/ a shadowing jako zastępowanie: http://shebang.pl/stp/shadowing . Abstrahując od tłumaczenia, shadowing u niego ma błędną definicję. Nie ma też tłumaczenia dla variable hiding.

Bardzo przydałby się kompleksowy i spójny słownik, a nie coś co miesza pojęciami i jest niekompletne.

Być może dlatego, że w Javie chyba nie da się przesłonić/ukryć metody.

W Javie metody niestatyczne da się tylko nadpisać (tzn override) albo przeciążyć (tzn overload). Pola niestatyczne można za to ukryć (tzn variable hiding).

Ja tam różnicy między shadow a hide w przypadku metod nie widzę.

Różnica zdecydowanie jest. Załóżmy, że mamy metody niestatyczne i niewirtualne. Jeśli podklasa ma metodę o takiej samej syganturze co nadklasa to mamy ukrywanie (tzn hiding). Jeśli klasa wewnętrzna ma metodę o takiej samej sygnaturze co klasa zewnętrzna to mamy przesłanianie (tzn shadowing). Przesłanianie można osiągnąć też na inne sposoby, bo na wiele sposobów można osiągnąć zagnieżdżone zasięgi. Ukrywanie (z tego co mi teraz wiadomo) ma natomiast nierozerwalny związek z dziedziczeniem.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 4x, ostatnio: Wibowit, 2019-12-02 15:08

Pozostało 580 znaków

2019-12-02 15:03
0

W Parent

int x = 123;
    void hello() {
int x = 456;
        System.out.println("Parent here");
    }

W Child

  @Override
    void hello() {

        System.out.println("Child here");
    }

albo zapisane bez @Override

    void hello() {

        System.out.println("Child here");
    }

Przesłanianie? Nadpisywanie?

Inny przykład

public class Parent {

    int x = 10;
    int y = 555;

    void hello() {

        System.out.println("Parent here");
    }

    private class Aunt {

        int x = 333;
        y = 999;

        void hello() {

            System.out.println("Aunt here");
        }

    }
}

Jakby wrzucić w internety to dostaniemy mozaikę sprzecznych się odpowiedzi

Java używa @Override dla subklasy, Dla klasy wewnętrznej metoda o tej samej sygnaturze nie może mieć annotacji @Override.
Jeszcze JavaScript i hoisting jakby było mało.

https://programming.guide/jav[...]adowing-hiding-obscuring.html
Na przykład obscuring.

Czy nazwanie zmiennej String jest OK?
Póki nie wywołamy instancji System,in albo System.out jest OK.
Programista używa obscuring albo masz ochotę wytłumaczyć mu dobitnie żeby jednak tego nie robił? :)

BTW gdyby nie ten wątek nie wpadłbym nawet na String System = "Foo Bar";.


"Ktoś sobie uświadomił, że pisał pod pseudonimem rzeczy, które lepiej żeby w firmie nie wypatrzyli :-)"

"- Ledwo na studiach 3 tydzień się kończy i już ciężko?
- Niestety prowadzący jest dziwny i robi kartkówki"
edytowany 1x, ostatnio: BraVolt, 2019-12-02 15:10

Pozostało 580 znaków

2019-12-02 15:10
0

W Javie adnotacja @Override służy tylko do sterowania komunikatami kompilatora. Nie ma wpływu na działanie programu, bo nie ląduje nawet w bajtkodzie.

https://programming.guide/jav[...]adowing-hiding-obscuring.html

Na przykład obscuring.

To "obscuring" wygląda mi na przypadek szczególny mechanizmu "shadowing".


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 5x, ostatnio: Wibowit, 2019-12-02 15:18

Pozostało 580 znaków

2019-12-02 15:39
0
   public boolean equals(Parent p) {

        if (this == p) return true;

        return x == p.x;
    }

    @Override
    public boolean equals(Object o) {

        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Parent parent = (Parent) o;

        return x == parent.x;
    }

Dla mnie informacja @Override jak i inne annotations służą do sterowania tego najsłabszego elementu całego procesu, siedzącego przed monitorem czyli mnie.

import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;

@ThreadSafe
public final class Counter {

    @GuardedBy("this")
    private long value = 0L;

    public synchronized long getValue() {

        return value;
    }

    public synchronized long increment() {

        return ++value;
    }
}

Jest @Override, to przyjmuję że overrided
Jest @ThreadSafe & @GuardedBy("intrinsic lock") to info dla mnie , (i konfiguracji IntelliJ, żeby zaczęło używać JCIP annotations) = na czym synchronizuję. Zapomnę synchronized przy metodzie to na mnie IntelliJ nakrzyczy. Oczywiście skompiluje się bez problemu.
Jest np. @Data by Lombok to info że jej bezargumentowy konstruktor i getters/setters jak pan pojo przykazał.

Dla mnie annotacje mają być pomocne, nie będę się z nimi spierać. Jest @Override w określonych sytuacjach to będę używać słowa override nawet gdyby było oficjalne zestawienie pojęć a w nim inny opis tej sytuacji.

Na szczęście nie muszę wchodzić w tematy tłumaczeń i szukania odpowiednich definicji. Współczuję zadania. Grząski temat.


"Ktoś sobie uświadomił, że pisał pod pseudonimem rzeczy, które lepiej żeby w firmie nie wypatrzyli :-)"

"- Ledwo na studiach 3 tydzień się kończy i już ciężko?
- Niestety prowadzący jest dziwny i robi kartkówki"

Pozostało 580 znaków

2019-12-02 15:45
0

Adnotacje @Override z Javowego stdliba i @Data z Lomboka działają zupełnie inaczej. Jak już napisałem, @Override jest całkowicie opcjonalne (można z tego całkowicie zrezygnować i kod będzie działał tak samo) i steruje tylko komunikatami kompilatora, ale już @Data z Lomboka ma kluczowy wpływ na wygenerowany kod. Używanie adnotacji @Override jest generalnie zalecane.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2019-12-02 15:47
No czyli to w Javie czasem używa się Override, a czasem nie. - somekind 2019-12-02 15:51
No w Javie też. Przy czym w Javie można dać @Override implementując metodę z interfejsu: interface Api { void a(); } public class Implementer implements Api { @Override public void a() { } } - Wibowit 2019-12-02 15:58
No w Javie też, może gdzieś jeszcze też, ale nie w C#. :P - somekind 2019-12-02 16:12

Pozostało 580 znaków

2019-12-02 15:56
0

Specjalnie dałem te 3 przykłady, z Java Concurrency in Practice, Lombok i equals. Każdy działa na swoim podwórku i robi swoje, mimo że mówimy annotation @... (trzymam się tylko Javy bez frameworków)
Dalej w małpki nie chcę się już wgłębiać bo nie jestem ich fanem.


"Ktoś sobie uświadomił, że pisał pod pseudonimem rzeczy, które lepiej żeby w firmie nie wypatrzyli :-)"

"- Ledwo na studiach 3 tydzień się kończy i już ciężko?
- Niestety prowadzący jest dziwny i robi kartkówki"

Pozostało 580 znaków

2019-12-02 16:19
0
Wibowit napisał(a):

Problem prawdopodobnie zaczął się od kulawego tłumaczenia np książek Caya Horstmanna. Przytoczę to co napisałem w komentarzach:

No czyli trzeba powiesić tłumacza. ;) (I nie czytać tłumaczeń.)

Różnica zdecydowanie jest. Załóżmy, że mamy metody niestatyczne i niewirtualne. Jeśli podklasa ma metodę o takiej samej syganturze co nadklasa to mamy ukrywanie (tzn hiding). Jeśli klasa wewnętrzna ma metodę o takiej samej sygnaturze co klasa zewnętrzna to mamy przesłanianie (tzn shadowing).

No tak, masz rację. Jakoś nie pomysłałem o takim przypadku - rzadko zagnieżdżam klasy, a przesłonięcie metody w taki sposób chyba mi się nigdy nie zdarzyło. Jakoś cięzko sobie wyobrazić praktyczne zastosowanie do tego.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2019-12-03 11:27
cs
0

Gdzieś czytałem, że termin overloading, jest błędnie tłumaczony na przeciążanie a powinien na przeładowanie. z tym, że nie w znaczeniu podobnym do przeciążania, ale w sensie jak przeładowanie np. karabinu czy działa. Stosując analogię działa, które jest identyfikatorem metody, ładujemy do niego różnego typu pociski np. burzący, odłamkowy itd. (czyli różnego typu argumentu: int ,String itd.),a ono po uruchomieniu daje podobne efekty. I co wy na to? Bo wg mnie "przeładowanie metody" jest bardziej logiczne niż "przeciążanie metody", bo przeciążanie kojarzy się bardziej z wychodzenie poza obszar normalnego użycia i ryzykiem katastrofy.

edytowany 1x, ostatnio: cs, 2019-12-03 11:49

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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