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

Člen

Zobrazeno 18 zpráv z 18.
//= 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.
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.
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?
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
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
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.WriteLine("Zadajte obvod prosím");
Kruznica kObvod = new Kruznica(double.Parse(Console.ReadLine()));
Console.WriteLine("{0}", kObvod.Obvod());
Console.ReadKey();
}
}
}
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.ZiskejObvod(double obvod)
http://www.itnetwork.cz/dev-lighter/182 tu jsem něco rychle splácal, jak by to mohlo vypadat
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;
Jo, to je přesně ono.
EDIT: Kdyžtak třída Math tam má přímo Pí ale to je jen takový detail.
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;
}
}
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"
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.
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.
Ne. Možní to tak spousta vývojářů dělá, ale je to špatně. Konstruktory jsou od toho, aby vytvářený objekt naplnily atributy.
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)
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;
}
}
}
Takže len trénovať aby som sa do toho dostal. Veľmi pekne ďakujem všetkým za rady a tŕpezlivosť.
Zobrazeno 18 zpráv z 18.