NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Soutěž: Machr na OOP - Reflexe

Soutěž již skončila

Zadání

Vaším úkolem v tomto machrovi bude vytvořit funkci (metodu), která dostane instanci nějaké třídy a co nejpřesněji vypíše předpis této třídy. Například v Javě by mohl výstup pro instanci třídy com.something­.NejakaTrida vypadat například takto:

package com.something;

import com.something.etwas.*;

public class NejakaTrida {
        public static final int MaxCount = 80;

        private int count = 16;

        public int getCount();

        public void add(DruhaTrida inst);

        public DruhaTrida get(int index);
}

Pozn.: Třída samozřejmě nebude vypadat takto, tohle je jen ukázka.

Všimněte si hodnot proměnných, vypište je jak u statických proměnných tak u těch "nestatických". Můžete i zjednodušit názvy a použít import / using (pokud ve vámi zvoleném jazyce jsou).

Snažte se vypsat co nejvíce informací dokážete ;) .

Je celkem jedno, jak výstup zobrazíte - klidně ho stačí vypsat do konzole nebo uložit do souboru.

Povolené jazyky jsou Java, C# / Visual Basic a PHP, pokud by někdo chtěl, může to zkusit i v JavaScriptu.

Výhra

Vítěz dostane placku Machr, a ocenění do portfolia.

Výhra

Výsledky

Jméno bodů Řešení ( Stáhnout vše )
pocitac770 100 Stáhnout řešení
Petr Čech 95 Stáhnout řešení
balaz.marek94 80 Stáhnout řešení
Jaroslav Polívka 5 Stáhnout řešení

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Zdeněk Pavlátka:28.1.2016 9:54

V této soutěži si budete hrát s reflexí.

Soutěž končí 7. února 12:00, tak se nezapomeň zapojit! :)

Odpovědět
28.1.2016 9:54
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Neaktivní uživatel:28.1.2016 13:21

Škoda, že není povolen Python, v něm by to byla gračka :-D

Nahoru Odpovědět
28.1.2016 13:21
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Marian Benčat:28.1.2016 14:14

Ona je to i hračka v .NETu :-) Dokud se tam netahá třeba generika.

Nahoru Odpovědět
28.1.2016 14:14
Totalitní admini..
Avatar
Odpovídá na Neaktivní uživatel
Zdeněk Pavlátka:28.1.2016 14:23

Nevím jak v PHP, ale v Javě a C# to je celkem jednoduché.
Genericitou se zabývat nemusíte.

Nahoru Odpovědět
28.1.2016 14:23
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Neaktivní uživatel:28.1.2016 17:08

Tak ja asi zkusim ten JS :) ani nebudu trvat na tom abyste to brali vazne pri opravovani .... jen pro zabavu

Nahoru Odpovědět
28.1.2016 17:08
Neaktivní uživatelský účet
Avatar
Jaroslav Polívka:28.1.2016 21:24

Taky zkouším něco vyplodit :)

Nahoru Odpovědět
28.1.2016 21:24
Velice často si věci žijí svým životem
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:29.1.2016 11:36

Je povoleno použít externí knihovnu jen na přeformátování výsledného kódu?
Starat se o správné odsazení je docela otrava...
konkrétně chci použít NArrange.

Editováno 29.1.2016 11:37
Nahoru Odpovědět
29.1.2016 11:36
the cake is a lie
Avatar
Odpovídá na Petr Čech
Zdeněk Pavlátka:29.1.2016 13:59

Ne, jen hezky odsazuj ;)

Nahoru Odpovědět
29.1.2016 13:59
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
pocitac770
Tvůrce
Avatar
pocitac770:29.1.2016 14:11

Jak velké nároky na to budou? Tzn. jestli se to bude zkoušet pouze jako samostatná utilitka na pouhé vypsání části "zdrojového kódu", nebo se na to budou dávat námahové testy, jako např. spuštění z 10 vláken najednou, s různými cíli apod? :D

 
Nahoru Odpovědět
29.1.2016 14:11
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Petr Čech:29.1.2016 14:15

Ok, škoda. :-(

Nahoru Odpovědět
29.1.2016 14:15
the cake is a lie
Avatar
Odpovídá na pocitac770
Zdeněk Pavlátka:29.1.2016 14:18

Žádné námahové testy určitě nebudou, budu vaše výtvory vkládat do různých projektů a zkoušet je na "náhodných" třídách.

Nahoru Odpovědět
29.1.2016 14:18
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:30.1.2016 17:12

Nevadí, že je to o dost víc metod než 1, že ne? A BTW, dá se odevzdat nové řešení?

Nahoru Odpovědět
30.1.2016 17:12
the cake is a lie
Avatar
Odpovídá na Petr Čech
Zdeněk Pavlátka:30.1.2016 18:45

Musíš mít jednu metodu, kterou budu volat já. Tahle metoda ale může "neomezeně" volat jiné metody.
Co myslíš "novým řešením"?

Nahoru Odpovědět
30.1.2016 18:45
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Petr Čech:30.1.2016 18:53

Jo super.
Nové řešení je, že třeba najdu v tom, co jsem odevzdal najdu chybu a budu chtít to staré řešení nahradit něčím opravenou verzí, jde to?
edit: to je ale krásný češtin, co? :D

Editováno 30.1.2016 18:54
Nahoru Odpovědět
30.1.2016 18:53
the cake is a lie
Avatar
Odpovídá na Petr Čech
Zdeněk Pavlátka:30.1.2016 18:56

Mělo by to jít tak, že to prostě znovu odevzdáš a mě se to zobrazí jako nová verze.

Nahoru Odpovědět
30.1.2016 18:56
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Petr Čech
Neaktivní uživatel:30.1.2016 19:08

Já teda NArrange neznám, ale není to spíš plugin do VS než knihovna?

Nahoru Odpovědět
30.1.2016 19:08
Neaktivní uživatelský účet
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Petr Čech:30.1.2016 19:30

Je to minimálně knihovna, jako plugin do VS by to bylo celkem k ničemu, nemá to co zajímavého nabídnout. Podívej se na NuGet

Nahoru Odpovědět
30.1.2016 19:30
the cake is a lie
Avatar
Odpovídá na Petr Čech
Neaktivní uživatel:30.1.2016 20:01

Díval jsem se a rozhodně to není knihovna. Je to spíš externí nástroj.

Nahoru Odpovědět
30.1.2016 20:01
Neaktivní uživatelský účet
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Petr Čech:30.1.2016 20:09

A jo, máš pravdu... potom nechápu, proč je to na NuGetu...

Nahoru Odpovědět
30.1.2016 20:09
the cake is a lie
Avatar
Nahoru Odpovědět
30.1.2016 20:11
Neaktivní uživatelský účet
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:31.1.2016 21:21

Nejspíš mám příušnice a zrovna nemám nic rozdělaného. Nemáte proti mně šanci :D

Nahoru Odpovědět
31.1.2016 21:21
the cake is a lie
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
pocitac770:1.2.2016 22:08

Co když budeme mít 3 různé metody, které budou "provozovat" 3 různé způsoby uložení výsledku? :-`

Editováno 1.2.2016 22:10
 
Nahoru Odpovědět
1.2.2016 22:08
Avatar
Odpovídá na pocitac770
Zdeněk Pavlátka:2.2.2016 9:18

Tak k tomu přidej 1, která bude mít navíc jako parametr typ uložení... (např. pomocí enum)

Nahoru Odpovědět
2.2.2016 9:18
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:5.2.2016 21:10

Ještě pár detailů:

  • bude nějak ohodnoceno zobrazení výstupu? Nedělá mi problém napsat tam těch pár řádků navíc na uložení do souboru (teď zobrazuju do konzole)
  • metoda si má vzít jako parametr instanci. Statické třídy jsou tedy vyloučeny?
Nahoru Odpovědět
5.2.2016 21:10
the cake is a lie
Avatar
Odpovídá na Petr Čech
Zdeněk Pavlátka:6.2.2016 9:21

Na typu výstupu nezáleží, hodnotí se jeho obsah.
Ano, statické třídy jsou vyloučeny, vždy dostaneš instanci. Ale pokud tam přidáš podporu statických tříd, nějaké ty body navíc se určitě najdou ;)

Nahoru Odpovědět
6.2.2016 9:21
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
balaz.marek94:6.2.2016 22:51

Môžeme použiť na reflexiu API z rôznych open source projektov? Alebo musíme využívať iba štandardné API ako je napr. java.lang.reflect ???

 
Nahoru Odpovědět
6.2.2016 22:51
Avatar
Odpovídá na balaz.marek94
Zdeněk Pavlátka:7.2.2016 8:15

jen standartní API daného jazyka

Nahoru Odpovědět
7.2.2016 8:15
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
pocitac770
Tvůrce
Avatar
pocitac770:7.2.2016 8:30

Ještě jeden dotaz. V zadání je napsáno, aby se ten parametr s objektem na prozkoumání předával metodě, ale je možnost to předat v konstruktoru? Moc mi to nesedí jako "statika" vzhledem k možnosti zamotání několika různých objektů do stejné třídy, viz jak jsem psal o těch zátěžových testech... (ano, bylo řečeno, že se to nebude zkoušet, ale prostě mi to tam nějak nesedí....), užití: např. při tom, když chceme metodu zavolat víckrát z různých míst po sobě (třeba kvůli zjištění změn v daném objektu), nemusíme si předávat zároveň objekt, stačí pouze ten prozkoumávač

Editováno 7.2.2016 8:33
 
Nahoru Odpovědět
7.2.2016 8:30
Avatar
Odpovídá na pocitac770
Zdeněk Pavlátka:7.2.2016 8:59

Klidně to tak udělej, ničemu to nevadí ;)

Nahoru Odpovědět
7.2.2016 8:59
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
pocitac770
Tvůrce
Avatar
pocitac770:7.2.2016 12:05

V posledních asi 30 vteřinách odesláno :D Doufám, že jsem tam něco nezapomněl přiložit, že je tam vše, co je potřeba (projekt "ReflexeTest" je funkční příklad užití), jsou tam složky s projekty... Tak mi prosím někdo řekněte, jestli je to v pořádku... :D
A kdy že by měly být výsledky?

 
Nahoru Odpovědět
7.2.2016 12:05
Avatar
pocitac770
Tvůrce
Avatar
pocitac770:7.2.2016 12:09

//EDIT: jsou tam ještě omylem přibalené v té testovací třídě nějaké moje starší "projekty" na testování, toho si prosím nevšímejte, při buildu se z nějakého důvodu neodstranily...

 
Nahoru Odpovědět
7.2.2016 12:09
Avatar
Zdeněk Pavlátka:7.2.2016 17:22

Díky všem za účast, zde jsou výsledky:

Jaroslav Polívka - 5 bodů
Očividně jsi moc nepochopil zadání. Nejen že tam nemáš metodu na vypsání předpisu třídy (1. věta zadání) - máš to jako součást jiné metody, ale dokonce ani tam ten předpis třídy nevypíšeš, vypisuješ jen seznam metod apod.

Co se týče vypisování hodnot proměnných, dá se pochopit, že nevypisuješ neznámé instance, ale např. String by jsi asi vypisovat měl. Navíc i u těch instancí je metoda toString().

A k tomuhle kódu bych měl pár připomínek:

String nazevTridy =  "" + edisonka.getClass().getName();
// ...
Class<?> c = Class.forName(nazevTridy);
  1. "" + edisonka.getClas­s().getName()
    • Class.getName() vrací String, takže připojovat ho k prázdnému Stringu je tak trochu nesmysl
  2. Class.forName(na­zevTridy)
    • Nechápu, proč tu "třídu" hledáš podle jména, když jí už máš k dispozici přes edisonka.getClas­s().

Petr Čech - 95 bodů

Tvé řešení se mi velmi líbilo, mám jen pár drobných připomínek
Je celkem zbytečné vypisovat using pro namespace ve kterém "jsi", např.:
using Reflex;
namespace Reflex {
    // ...
}

- pokud se chceš zbavit duplicitních hodnot, můžeš místo listu a metody Where(pair => !namespaces.Con­tains(pair.Va­lue)) použít množinu (HashSet), která si duplicitní hodnoty hlídá sama při vkládání
- u TrimTypeName by jsi mohl přidat podporu pro long (Int64), short (Int16) a byte (Byte) a typy bez znaménka (uint apod.)

Za tohoto machra získáváš placku, můžeš si vybrat mezi C# a OOP.

balaz.marek94 - 80 bodů
Tvůj výtvor nevypadá špatně, jen škoda, že nevypisuje hodnoty proměnných.

pocitac770 - 100 bodů
Krásný výtvor, + jako jediný umí vypsat vnořené třídy.

Za tohoto machra získáváš placku, můžeš si vybrat mezi Javou a OOP.

Placku tedy získává czubehead, počítač770 Gratuluji :)

Nahoru Odpovědět
7.2.2016 17:22
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:7.2.2016 17:34

Díky, myslím, že ty duplicitní namespacy jsem tam někdy v počátku vývoje zakomponoval, ale časem se to zkomplikovalo.

Nahoru Odpovědět
7.2.2016 17:34
the cake is a lie
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 33 zpráv z 33.