Avatar
Peter Lazorik:23.8.2013 16:21

Dobrý deň,
Dajme tomu, že by som chcel spraviť program na výpočet kvadratickej rovnice v OOP, ak by som vychádzal z tejto kapitoly tak počet stien bol zadaný ako parameter, ale ak rátam kvadratickú rovnicu tak koeficienty sú do značnej miery rôzne takže zrejme by sa zadávali ako vstup od užívateľa z klávesnice ako ten vstup z klávesnice spravím v OOP C#?

Odpovědět 23.8.2013 16:21
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Peter Lazorik
Jan Vargovský:23.8.2013 16:23

Ty 3 čísla budeš někde muset uložit, to znamená, že si je v té hlavní metodě normálně necháš a předáš je v parametru té metodě, která už se postará o zbytek.

 
Nahoru Odpovědět 23.8.2013 16:23
Avatar
Odpovídá na Jan Vargovský
Peter Lazorik:23.8.2013 16:35

Takže si napr. deklarujem private premenne a, b, c potom vytvorím konštruktor a v ňom im priradím hodnoty cez Console.ReadLine(); hneď v tomto konštruktore nechám vypočítať diskriminant a korene poprípade to tu aj budem vetviť pre záporný diskriminant potom vytvorím metódu v ktorá bude vracať korene x1 a x1 ako návratovú hodnotu a v hlavnom programe Program.cs tie korene nechám vypísať samozrejme po založení instancie. Mohlo by to tak byť z hľadiska OOP?

Nahoru Odpovědět 23.8.2013 16:35
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Peter Lazorik
Petr Nymsa:23.8.2013 16:44

Skoro až na to že třída která slouží pro výpočet rovnic nebude načítat vstup od uživatele. Pouze bude očekávat čísla a je jedno jestli ji přijdou načtené ze souboru, poslané přes internet nebo načtené z klávesnice :)

Nahoru Odpovědět 23.8.2013 16:44
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Peter Lazorik
Jan Vargovský:23.8.2013 16:46

Nene. Přece nebudeš vytvářet instanci třídy pokaždé, když budeš zadávat nové koeficienty, ne? Toto není moc dobrý příklad na oop, resp. nevidíš v tom tu efektivnost. Jednoduše budeš mít třídu, která bude mít metodu na vypočítání kvadratické rovnice z koeficientů, které jsou zadané v parametru té metody, pak si uděláš ještě privátní metodu, která ti rozdělí ten velký problém na menší -> bude ti vypočítávat diskriminant. Pak je ještě problém, že kvadratická rovnice má většinou 2 výsledky, to znamená, že je potřebuješ nějak vrátit, takže bych si udělal nějakou pomocnou třídu, která by měla jen 2 vlastnosti a to x1 a x2 :)

Editováno 23.8.2013 16:47
 
Nahoru Odpovědět 23.8.2013 16:46
Avatar
Peter Lazorik:23.8.2013 17:09

Dobre tak inak skúsim to na niečom jednoduchšom napr. obvod kružnice mohlo by to vyzerať takto?
Class Kruznica.cs:
namespace Kruznica
{
// Konštruktor
class Kruznica
{
private double obvod;
public Kruznica(double polomer)
{
obvod = 2 * 3.14 * polomer;
}
//Metoda
public double Obvod()
{
return obvod;
}
}
}
Program.cs:
namespace Kruznica
{
class Program
{
static void Main(string[] args)
{
Console.Write­Line("Zadajte obvod prosím");
Kruznica kObvod = new Kruznica(double­.Parse(Console­.ReadLine()));
Console.Write­Line("{0}", kObvod.Obvod());
Console.ReadKey();
}
}
}

Editováno 23.8.2013 17:11
Nahoru Odpovědět 23.8.2013 17:09
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Peter Lazorik
Jan Vargovský:23.8.2013 17:18

Nene, ten konstruktor tam vůbec nedávej, to je většinou na nastavení potřebných proměnných dané třídy. Každá ta funkce, by měla být závislá na tom co dostane v parametru.

Představ si, že máš za úkol vytvořit graf závislosti obvodu na poloměru ( u té tvojí kružnice třeba)

Pokaždé, co by jsi chtěl vypočítat ten obvod, by jsi musel vytvořit nový objekt ( to je to = new ...) z hlediska výkonu je to plýtvání, takže by jsi měl jen volat kružnice.Ziske­jObvod(double obvod)

 
Nahoru Odpovědět 23.8.2013 17:18
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Peter Lazorik
Jan Vargovský:23.8.2013 17:23

http://www.itnetwork.cz/dev-lighter/182 tu jsem něco rychle splácal, jak by to mohlo vypadat

 
Nahoru Odpovědět 23.8.2013 17:23
Avatar
Peter Lazorik:23.8.2013 17:30

Takže konštruktor vymazať. A ten vzorec v konštruktore presunnú pred return do metódy Obvod a potom už len na metóde obvod definovať parameter?
public double Obvod(double polomer)
obvod = 2 * 3.14 * polomer;
return obvod;

Nahoru Odpovědět 23.8.2013 17:30
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Peter Lazorik
Jan Vargovský:23.8.2013 17:32

Jo, to je přesně ono.

EDIT: Kdyžtak třída Math tam má přímo Pí :) ale to je jen takový detail.

Editováno 23.8.2013 17:33
 
Nahoru Odpovědět 23.8.2013 17:32
Avatar
Peter Lazorik:23.8.2013 17:48

A mohlo by to byť aj takto?
class Kruznica
{
private double obvod;
public double polomer;
public double Obvod()
{
obvod = 2 * 3.14 * polomer;
return obvod;
}
}

Nahoru Odpovědět 23.8.2013 17:48
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Peter Lazorik
Jan Vargovský:23.8.2013 17:53

Na přístup k proměnným třídy máme vlastnosti (get/set) nebo public metody, zase by jsi udržoval zbytečný poloměr a obvod v paměti, který potřebuješ jen když voláš tu metodu Obvod.

Ještě poznámka, na kódy tu máme "Vložit zdrojový kód"

 
Nahoru Odpovědět 23.8.2013 17:53
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:23.8.2013 17:59

Obvod můžeš udělat jako prázdný atribut a k němu napíšeš getter, který si ten obvod spočítá. Případně i setter.

Nahoru Odpovědět 23.8.2013 17:59
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Peter Lazorik:23.8.2013 18:01

Z toho vlastne vyplýva, že: 1. Najlepšie je inicializovať premenné cez parametre metódy.
2. Premenné, alebo parametre sa inicializujú v iba v Program.cs nie v Class.
3. Premenné, alebo parametre sa v Class iba deklarujú.
Pochopil som to správne?
Akurát si to musím vyjasniť okolo konštruktorov.
Vďaka za tu poznámku.

Nahoru Odpovědět 23.8.2013 18:01
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Peter Lazorik
Kit:23.8.2013 18:08

Ne. Možní to tak spousta vývojářů dělá, ale je to špatně. Konstruktory jsou od toho, aby vytvářený objekt naplnily atributy.

Nahoru Odpovědět  +1 23.8.2013 18:08
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jan Vargovský
David Čápka:23.8.2013 18:13

Záleží jak často ten obvod chce, kolik těch kružnic má a jestli se ty kružnice mění (případně jak často) :)

Nahoru Odpovědět 23.8.2013 18:13
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Peter Lazorik
Kit:23.8.2013 18:26

Zkus si tento příklad. Vytvořil jsem kružnici k, nadefinoval jsem její poloměr. Obvod je atribut závislý na poloměru, proto je zbytečné ho mít v objektu. Přesto k němu mohu mít getter i setter.

using System;

class Kruznice {
    static void Main(string[] args) {
        Kruznice k = new Kruznice();
        k.Polomer = 5;
        Console.WriteLine(k.Obvod);
        k.Obvod = 10;
        Console.WriteLine(k.Polomer);
    }

    public double Polomer{get; set;}

    public double Obvod {
        get {
            return 2 * 3.14 * Polomer;
        }
        set {
            Polomer = value / 2 / 3.14;
        }
    }
}
Nahoru Odpovědět 23.8.2013 18:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Peter Lazorik:23.8.2013 20:10

Takže len trénovať aby som sa do toho dostal. Veľmi pekne ďakujem všetkým za rady a tŕpezlivosť.

Nahoru Odpovědět 23.8.2013 20:10
Naše cnosti a naše vady sú neoddeliteľné ako sila a hmota, keď ich oddelíte človek prestane existovať.
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 18 zpráv z 18.