eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Co może robić konstruktor i dlaczego nie?
Ilość wypowiedzi w tym wątku: 63

  • 1. Data: 2012-07-04 20:50:53
    Temat: Co może robić konstruktor i dlaczego nie?
    Od: "slawek" <h...@s...pl>

    Niech będzie sobie klasa (w czymkolwiek, niekoniecznie C++)

    class Foo { Foo(){...}; run(){...} };

    Obiekt tej klasy tworzymy sobie jako Foo foo = new Foo(); // czy jakoś tak,
    nieważne

    Obiekt istnieje, więc przychodzi czas na metodę run(), która jak sama nazwa
    wskazuje (BASIC) robi to co robi.

    I tu jest pytanie, a nawet dwa:

    1. Czy nie wystarczyłoby zrobić copy-paste tego co ma run() w środku do
    konstruktora i wy...ć [ref1] zbędne już run() ?

    2. Czy metodę run() można wywoływać w konstruktorze (i dlaczego nie?)

    Jeszcze raz - wywołanie konstruktora i run() są jedno-po-drugim, nigdy nie
    będzie potrzeby rozdzielenia. UWAGA: podkreślam - niekoniecznie C++. Także
    C#, Java, cokolwiek co lubicie.

    TIA
    slawek

    [ad ref1] ... = rzuci


  • 2. Data: 2012-07-04 21:49:13
    Temat: Re: Co może robić konstruktor i dlaczego nie?
    Od: "Jordan Szubert" <u...@j...us.to>

    Dnia 04-07-2012 o 20:50:53 slawek <h...@s...pl> napisał(a):

    > Niech będzie sobie klasa (w czymkolwiek, niekoniecznie C++)
    >
    > class Foo { Foo(){...}; run(){...} };
    >
    > Obiekt tej klasy tworzymy sobie jako Foo foo = new Foo(); // czy jakoś
    > tak, nieważne
    >
    > Obiekt istnieje, więc przychodzi czas na metodę run(), która jak sama
    > nazwa wskazuje (BASIC) robi to co robi.
    >
    > I tu jest pytanie, a nawet dwa:
    >
    > 1. Czy nie wystarczyłoby zrobić copy-paste tego co ma run() w środku do
    > konstruktora i wy...ć [ref1] zbędne już run() ?
    >
    > 2. Czy metodę run() można wywoływać w konstruktorze (i dlaczego nie?)
    >
    > Jeszcze raz - wywołanie konstruktora i run() są jedno-po-drugim, nigdy
    > nie będzie potrzeby rozdzielenia. UWAGA: podkreślam - niekoniecznie C++.
    > Także C#, Java, cokolwiek co lubicie.
    >
    > TIA
    > slawek
    >
    > [ad ref1] ... = rzuci

    nie widzę, jaka właściwość jakiego języka wymuszałaby taki zapis,
    podejrzewam inny powód:
    obiekt foo ma sporo właściwości, które mają rozsądne wartości domyślne
    ustawiane w konstruktorze, ale pomiedzy konstrukcją a foo.run() masz
    możliwość skonfigurowania Sobie obiektu, jeśli jest to taki rzadki
    wypadek, gdy domyślne ustawienia są nieoptymalne...


    --
    Jordan Szubert


  • 3. Data: 2012-07-04 22:34:35
    Temat: Re: Co może robić konstruktor i dlaczego nie?
    Od: "slawek" <h...@s...pl>

    Użytkownik "Jordan Szubert" napisał w wiadomości grup
    dyskusyjnych:o...@a...home...

    >nie widzę, jaka właściwość jakiego języka wymuszałaby taki zapis,

    Mniejsza o zapis, rzecz jest nie w notacji, lecz w fakcie iż obiekt jest
    konstruowany przez konstruktor, czyli dopiero po wykonaniu konstruktora
    obiekt jest... skonstruowany. De facto C++ wywołuje wszystkie konstruktory
    podobiektów oraz rodziców zanim wejdzie do body "naszego konstruktora" (więc
    nasz obiekt ma wszystko co trzeba)...

    ale - konstruktor może się sam-z-siebie wywołać (np. jakiś obiekt tymczasowy
    się przypląta). I to jest problem, przynajmniej w C++. Ale czy są jakieś
    języki wolne od tego?

    >podejrzewam inny powód:
    >obiekt foo ma sporo właściwości, które mają rozsądne wartości domyślne

    Nie podejrzewaj. Klasa Foo jest zupełnie przykładowa, cudów w niej nie ma.
    Po prostu rozpisałem sobie coś na klasy i... w każdej - chyba jednak -
    powinien być run(), co doprowadza mnie do zdziwienia "czy to naprawdę
    potrzebne, czy nie wystarczy sam konstruktor?" No bo i po co metoda run -
    skoro klasa jak tylko się utworzy ma robić run - aż do destrukcji?

    >ustawiane w konstruktorze, ale pomiedzy konstrukcją a foo.run() masz
    >możliwość skonfigurowania Sobie obiektu, jeśli jest to taki rzadki
    >wypadek, gdy domyślne ustawienia są nieoptymalne...

    Różnica pomiędzy czymś takim (C++)

    int main() { Foo foo = new Foo; delete foo; return 0; }

    a czymś takim

    int main() { Foo foo = new Foo; foo.run(); delete foo; return 0; }

    Pierwszy zapis jest po prostu krótszy. Ponadto running czegoś jest po prostu
    1:1 z istnieniem obiektu.

    Rozkładające, w C++, byłoby {Foo foo = Foo();} , tzn. najpierw jest
    tworzony tymczasowy obiekt Foo (przez wywołanie konstruktora), potem
    następowałoby kopiowanie tymczasowego obiektu na foo... "zaszyte w
    konstruktor run()" byłoby odpalane w mało przewidywalny sposób. Ale podobna
    składnia w Javie wydaje się być znacznie bezpieczniejsza, bo { Foo foo = new
    Foo(); } nie używa /obiektu/ foo, ale /referencji-do-obiektu-foo/, czyli w
    C++ byłoby to { Foo& foo = Foo(); }

    Z drugiej strony Java będzie pewnie miała mały problem - nie wiadomo kiedy
    będzie niszczony obiekt foo (i czy w ogóle).

    A ponadto - osobliwie ciekawe pytanie, raczej C++/C# - czy możliwe jest
    destrukcja obiektu już w tego obiektu konstruktorze?


  • 4. Data: 2012-07-05 02:16:25
    Temat: Re: Co może robić konstruktor i dlaczego nie?
    Od: Michoo <m...@v...pl>

    On 04.07.2012 22:34, slawek wrote:
    > Różnica pomiędzy czymś takim (C++)
    >
    > int main() { Foo foo = new Foo; delete foo; return 0; }
    >
    > a czymś takim
    >
    > int main() { Foo foo = new Foo; foo.run(); delete foo; return 0; }
    >
    Foo().run();

    --
    Pozdrawiam
    Michoo


  • 5. Data: 2012-07-05 07:55:57
    Temat: Re: Co może robić konstruktor i dlaczego nie?
    Od: "Wojciech \"Spook\" Sura" <s...@o...pl>

    Dnia 04-07-2012 o 20:50:53 slawek <h...@s...pl> napisał(a):
    > 1. Czy nie wystarczyłoby zrobić copy-paste tego co ma run() w środku do
    > konstruktora i wy...ć [ref1] zbędne już run() ?

    Do takiego scenariusza IMO znacznie bardziej nada się lambda, a nie klasa.

    > 2. Czy metodę run() można wywoływać w konstruktorze (i dlaczego nie?)

    Doprecyzuj pytanie. Wywołać metodę w konstruktorze zawsze można.

    > TIA
    > slawek

    Pozdrawiam -- Spook.

    --
    Używam klienta poczty Opera Mail: http://www.opera.com/mail/


  • 6. Data: 2012-07-05 07:56:56
    Temat: Re: Co może robić konstruktor i dlaczego nie?
    Od: Paweł Kierski <n...@p...net>

    W dniu 2012-07-05 02:16, Michoo pisze:
    > On 04.07.2012 22:34, slawek wrote:
    >> Różnica pomiędzy czymś takim (C++)
    >>
    >> int main() { Foo foo = new Foo; delete foo; return 0; }
    >>
    >> a czymś takim
    >>
    >> int main() { Foo foo = new Foo; foo.run(); delete foo; return 0; }
    >>
    > Foo().run();
    >

    Pytanie, dlaczego nie Foo::run(), czyli metoda statyczna, czyli zwykła
    funkcja? Domyślam się, że z powodu dużego skomplikowania funkcji,
    w szczególności dużo elementów stanu, czyli potrzeba w rozdzaju:
    http://www.refactoring.com/catalog/replaceMethodWith
    MethodObject.html

    W C++ uważałbym na czas życia obiektu - lepiej nie przekazywać
    zewnętrznym obiektom o dłuższym czasie życia nic związanego z this. Ale
    tak samo byłoby w przypadku zwykłej funkcji.

    Dodatkowo można jeszcze z takiego obiektu/funkcji zwracać wartość:

    zamiast:
    MyType foo(params);

    class Foo
    {
    public:
    Foo(params);
    operator MyType(); // musi zwracać kopię - patrz wyżej
    };

    Można wtedy zamiast:

    MyType myVar = foo(params);

    pisać:

    MyType myVar = Foo(params);

    --
    Paweł Kierski
    n...@p...net


  • 7. Data: 2012-07-05 07:57:26
    Temat: Re: Co może robić konstruktor i dlaczego nie?
    Od: Paweł Kierski <n...@p...net>

    W dniu 2012-07-05 07:55, Wojciech "Spook" Sura pisze:
    > Dnia 04-07-2012 o 20:50:53 slawek <h...@s...pl> napisał(a):
    >> 1. Czy nie wystarczyłoby zrobić copy-paste tego co ma run() w środku
    >> do konstruktora i wy...ć [ref1] zbędne już run() ?
    >
    > Do takiego scenariusza IMO znacznie bardziej nada się lambda, a nie klasa.

    Zależy, jak skomplikowana funkcja.

    --
    Paweł Kierski
    n...@p...net


  • 8. Data: 2012-07-05 08:29:34
    Temat: Re: Co może robić konstruktor i dlaczego nie?
    Od: "slawek" <h...@s...pl>

    Użytkownik "Michoo" napisał w wiadomości grup
    dyskusyjnych:jt2mjk$hud$...@m...internetia.pl...

    >Foo().run();

    Ok, też można. Nie zrozumiałeś jednak pytania. Bo to co proponujesz to dalej
    używanie metody run/execute/command/...

    A chodziło o taką "filozofię", w której samo istnienie obiektu uruchamia
    jego działanie.

    Czyli nie ma potrzeby "mieć obiekt i potem kazać mu coś zrobić" - tylko
    "obiekt robi coś, bo po prostu istnieje".


  • 9. Data: 2012-07-05 08:32:37
    Temat: Re: Co może robić konstruktor i dlaczego nie?
    Od: "slawek" <h...@s...pl>

    Użytkownik "Wojciech "Spook" Sura" napisał w wiadomości grup
    dyskusyjnych:o...@s...wroclaw.optopol.
    zawiercie...

    >Doprecyzuj pytanie. Wywołać metodę w konstruktorze zawsze można.

    Doprecyzuj "zawsze" - tzn. w jakich językach można.

    Na razie wiem - z tego co napisałeś - że nie znasz ani jednego języka, w
    którym to języku nie można byłoby.


  • 10. Data: 2012-07-05 08:42:00
    Temat: Re: Co może robić konstruktor i dlaczego nie?
    Od: "Artur M. Piwko" <m...@b...pl>

    In the darkest hour on Thu, 05 Jul 2012 07:56:56 +0200,
    Paweł Kierski <n...@p...net> screamed:
    >>> int main() { Foo foo = new Foo; delete foo; return 0; }
    >>>
    >>> a czymś takim
    >>>
    >>> int main() { Foo foo = new Foo; foo.run(); delete foo; return 0; }
    >>>
    >> Foo().run();
    >
    > Pytanie, dlaczego nie Foo::run(), czyli metoda statyczna, czyli zwykła
    > funkcja? Domyślam się, że z powodu dużego skomplikowania funkcji,
    > w szczególności dużo elementów stanu, czyli potrzeba w rozdzaju:
    > http://www.refactoring.com/catalog/replaceMethodWith
    MethodObject.html
    >

    Pytanie dlaczego nie jeśli po wykonaniu nie będzie potrzebny:
    int Foo_run() {...}

    --
    [ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:233B ]
    [ 08:40:57 user up 13220 days, 20:35, 1 user, load average: 0.01, 0.89, 0.19 ]

    Things always look better when you can't see them. -- Craig Bruce

strony : [ 1 ] . 2 ... 7


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: