Diskuze: C# úprava non-OOP na OOP
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 26 zpráv z 26.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ta tvoje metoda HodDoHospody je sice vynalézavá, ale ve skutečnosti ti stačí tohle, pokud chceš náhodně vybrat ano/ne:
var r = new Random();
var b = Convert.ToBoolean(r.Next(0,2));
jestli chceš OOP, tak to udělej pomocí WPF graficky. Nebo to přepiš pomocí LINQ, ale to není OOP
Díky za radu. Mně šlo právěže o to jak to napsat. Jakože jaký třídy, v nich metody, proměnné atd. Prostě opravdu souhra objektů či jak to nazvat. Nedokážu udělat komplexní OOP program, umím jenom malé metody. Můžeš kdyžtak doporučit nějakou knihu / návod nebo mi poradit, jak si to procvičit?
Pokud se chceš naučit programovat, jdi na checkio.org.
Já jsem známý tím, že v OOP takový zlatý grál nevidím, takže mi to přijde, jako ti ukazovat, kudy nejrychleji do pekla.
Hezká knížka je ale tato:
https://www.zonerpress.cz/…vrhove-vzory
Ale je trochu náročnější.
Tak zkus jinde, nebo si ji přečti anglicky:
http://it-ebooks.info/book/202/
Ale dřív než začneš OOP, měl bys zkusit redukovat svůj stávající kód tak na třetinu. Nevím, co máš za IDE, ale pravděpodobně na tebe řve, že vlevo a vpravo nikde nepoužíváš. Proměnné xxx a yyy jsou také úplně zbytečné. C# myslím zná cyklus Do while. Také se zamyslí, jestli bys nemohl vhodněji využít switch-case místo if-else.
Podrženo, sečteno. Zatím pořádně nevyužíváš základní konstrukce, takže zadělávat si v šišce na další zmatek s OOP, ti moc neprospěje
PS: Ale jinak tě musím pochválit, že na to jdeš přes příkazovou řádku. Spousta jiných se na tvém místě se snaží začínat rovnou s XNA
Mám Visual C# Express 2010.
Nevím, nic na mě neřve .
No, zkusím si to dnes večer ještě přepsat a dám si víc záležet.
Kdyžtak ti to uploadnu.
Zamysli se, jestli opravdu potřebuješ ten přepínač Ano/Ne
Nestačí ti tohle? Doleva -1, doprava +1
int pos = 0;
var r = new Random();
for (int i = 0; i < 1000; i++) {
pos -= r.Next(0,2)==0?-1:1;
Console.WriteLine(pos);
}
Console.ReadKey();
Jo a v té mé metodě si můžu ovlivňovat pravděpodobnost toho true /
false.
Kód jsem zkrátil o 20 řádků :
using System;
using System.Threading;
namespace Opilcova_procházka_2
{
class Program
{
static bool Kam()
{
var a = new Random();
bool b = Convert.ToBoolean(a.Next(0,2));
return b;
}
static void Main(string[] args)
{
char c = '5';
do
{
Console.WriteLine("Zadej vzdálenost hospody od domova.");
int delka = int.Parse(Console.ReadLine());
int opilec = delka / 2;
int kroku = 0;
char[] cesta = new char[delka];
for (int i = 0; i < delka; i++)
cesta[i] = '-';
cesta[opilec] = '#';
while (opilec > 0 && opilec < delka - 1)
{
Thread.Sleep(100);
Console.Clear();
cesta[opilec] = '-';
if (Kam())
{
opilec++;
cesta[opilec] = '#';
}
else
{
opilec--;
cesta[opilec] = '#';
}
kroku++;
Console.Write("Hospoda");
for (int i = 0; i < delka; i++)
Console.Write(cesta[i]);
Console.Write("Doma");
}
//závěr
if (opilec == 0)
Console.WriteLine("\nOpilec se vrátil do hospody.");
else
Console.WriteLine("\nOpilec šťastně dorazil domů.");
Console.WriteLine("\nPro opakování ztiskni 5.");
c = Console.ReadKey().KeyChar;
}
while (c == '5');
}
}
}
pos -= r.Next(0,2)==0?-1:1;
Tohle nechápu.
PS: Už jsem to znovu zkrátil na 57 řádků. Ale dávat to sem nebudu.
To by se dalo přepsat na toto:
if(r.Next(0,2) == 0)
pos -= -1
else
pos -= 1
Co se týče té pravděpodobnosti, nic ti nebrání to napsat takto
pos -= r.Next(0,100)<40?-1:1; //40% že půjde doleva, 60% že půjde doprava
Ahoj, ale pokud se ptal na to aby to bylo více objektově, tak těma změnama si zkrátil zápis, ale objekt si nepřidal. Ta myšlenka by měla být taková, že máš vše co je nějáký celek v objektu, celek je ale možná blbej název. Prostě nějákou logiku, kterou potom můžeš i repoužít. Třeba tady bys to měl Cestu, Cesta by měla třeba metodu VykresliCestu() podle nějákých parametrů. Takže bys na začátku kodu neměl ten cyklus, ale jenom Cesta cesta = new Cesta() a podtím cesta.VykresliCestu()...třeba jako další hru bys měl závod dvou opilců domů a tam bys zase použil tu cestu, aniž by si jí musel dělat znovu. Ideální stav by tedy byl třeba jenom v mainu mít třídu HraKamSeVydaOpilec a ta třída by brala dva parametry instanci typu opilec a cesty....
Budu parafrázovat...
Když jediné, co umíš, je bouchat kladivem, tak všechny problémy
připomínají hřebíky.
Nemá smysl uměle řešit opilcovu procházku pomocí objektů. Bylo by to
krkolomné a zbytečné, nota bene pokud nelze stavět na solidních
základech.
Připomíná to situaci, kdy se doplazíš ke kaluži, a místo aby ses učil
skákat, budeš si chtít postavit letadlo, aby ses dostal na druhou stranu.
Není důvod začínat s objekty, pokud neznáš základní konstrukce a datové
typy konkrétního jazyka. Jinak ti hrozí, že budeš vymýšlet znovu
kolo.
Je dobré se porozhlédnout i jinde než ve světě IT. Moc hezká je třeba definice sportu: S co nejmenším úsilím, co nejvyšší možný výkon.
Ovšem možná dáváš přednost sokolské definici. Ta praví: "S co největším úsilím, co největší možný výkon." Spolu se smutným Tondou dávám přednost prvnímu.
(Poznámka pro zvědavé. Jde o literání odkaz na dílo spisovatele Žáka.)
Dobře, ale tu konzoli psal člověk, co určitě základní představy o konstrukci má. A samozřejmně, že je občas vytvářet jednoduchou věc nuceně objektově vlastně zbytečné, ale právě na těch jenoduchých příkladech se to učí.
určitá základní představa != solidní základy
Na procvičení OOP je lepší použít něco, kde se ty objekty samy
nabízejí, namátkou třeba karetní hry.
Na řešení jednoduchého algoritmu to je zbytečné. Navíc zdejšímu
osazenstvu by prospělo, kdyby se snažilo řešit problémy bez OOP. Aspoň by
pak nevznikaly tuny zbytečného kódu místo přiměřených pár řádek
Já prostě zastávám názor, že co má jenom trochu smysl dávat do objektů by tam mělo být, ale to at si už každý dělá podle sebe.
No přesně to jsem myslel. Já jakože jednotlivý metody udělám, ale
navrhnout celkově co bude dělat, to už mi dělá problém. Nemám v tom
skill. To by nejspíš chtělo si projít nějaký open-source, ale moc nevím
jaký a kde :/
Možná by bylo dobrý trochu umět i takový ty diagramy tříd a tak, že by
mi to pomohlo do toho prohlédnout, ale nevím, jestli by to k něčemu
bylo.
Zkusil jsem to trochu zkrátit po svém
Výsledek je cca 35 řádků, spousta z toho jsou ale závorky
Není to zdaleka nejkratší, co by se dalo. Je tam hodně míst, které bych
mohl zkrátit silou, ale snížila by se čitelnost. Také jsem se nesnažil o
nic originálního, šlo mi jen o úpravu stávajícího kódu. Jen tak na
ukázku, co se dá vymyslet
Pokud to někoho zajímá, ať zadá do google code golf nebo programming golf.
Wow, tolik věcí co neznám. No až se budu nudit, místo cska se budu věnovat např. těm otazníkům Díky ti za alternativní řešení.
V zásadě postupně plnis programátorské ulohy,které systém sám vyhodnocuje a za které se ti odemyká přístup k jinym.
Existuje hodně stránek, které dělají totéž co checkio. Nabízejí ti
programátorské úlohy a ty se je snažíš vyřešit pomocí kódu.
Checkio je ovšem podle mne výjimečné. Má velmi propracovaný a jednotný
systém; nakonec ho v podstatě dělal jednom jeden člověk, Bryukh.
Ty ostaní systémy jsem zkoušel, ale většinou stojí za pendrek. Ne že by
se nedaly používat, ale jsou moc roztříštěné a nesedly mi
Samotné úkoly jsou na checkio velmi zajímavé a řešení se testuje
opravdu důkladně.
V tamější komunitě bez nadsázky najdeš nejlepší programátory na
světě, a to nejen v pythonu.
Komunitu netvoří převážně náctiletí.
A navíc, checkio má Vekyho
Velká výhoda je i v tom, že se (zatím) programuje výhradně v pythonu. Takže krom toho, že tě systém donutí se naučit výborný programovací jazyk, tak si díky prohlížení cizích řešení rozšíříš rozhled, a to podstatně.
Takže to shrnu:
Zobrazeno 26 zpráv z 26.