Diskuze: C# funkce-info

C# .NET .NET (C# a Visual Basic) C# funkce-info American English version English version

Avatar
jt.e
Člen
Avatar
jt.e:

Ahoj, mám zase jeden začátečnický dotaz:

Řekněme, že vytvořím nějakou třídu, s funkcí, která bude něco vypisovat do textu. A když budu chtít tuto třídu použít v jiných projektech bez úprav pro konzolovou aplikaci nebo pro WinForm co musím udělat?

Nevím jak to popsat, tak to raději předvedu:

příklad pro konzoli:

void Funkce()
{
 if(neco)Console.WriteLine("text");
}

pro Windows Form:

void Funkce()
{
 if(neco)MessageBox.Show("text");
}

univerzální funkce:

void Funkce()
{
 if(neco)
 {
  if(jsi_v_projektu_console_app) Console.WriteLine("text");
  else MessageBox.Show("text");
 }
}

Dá se to nějak řešit?

 
Odpovědět 19.11.2015 21:25
Avatar
Odpovídá na jt.e
Michael Škrášek:

Vytvoř novou knihovnu, dej tam tento kód a pak do jednotlivých projektů akorát přidáváš reference.

Nahoru Odpovědět  +1 19.11.2015 21:31
Proč to dělat složitě, když to jde jednoduše.
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na jt.e
ostrozan:

Vlastní knihovna, jak psal Michal

Jinak dvě věci:
1). funkcím se v OOP říká metody, stejně jako se fukcím v C neříká po asemblerovsku podprogramy/rutiny - není to samoúčelné - funguje to mimo jiné jako rozlišení "o čem je řeč"

2). tvoje otázka je spíš řečnická - .NET nabízí všechno, co si jen dokážeš představit a ještě víc toho, co si jako začátečník ani předatavit nedokážeš. :)

 
Nahoru Odpovědět  +1 19.11.2015 23:00
Avatar
Milan Křepelka
Redaktor
Avatar
Odpovídá na Michael Škrášek
Milan Křepelka:

Tak jak je popsáno není vhodné dávat do jedné sdílené knihovny.
Je to matlání více prezentačních technologií do jedné knihovny. Takhle se to nedělá. Pak bys měl
IF console
IF WF
IF WPF
IF WEB
IF MOBILE
a nareferencované všechny assebmlies do sdílené knihovny, což jaksi popírá její primární funkci. Sdílené knihovny jsou prosty od těchto věcí, právě proto aby se daly používat samostatně, což znamená co nejmenší počet závislostí.

 
Nahoru Odpovědět 20.11.2015 6:35
Avatar
jt.e
Člen
Avatar
jt.e:

Díky za reakce.

Tato otázka mě na padla právě z toho důvodu, že znám C# pouze okrajově, a tak nevím, jestli už to není v C# třeba nějak "vytuněné".

funkcím se v OOP říká metody
Já myslel, že je to pouze záležitost slovníku.

 
Nahoru Odpovědět 20.11.2015 17:48
Avatar
Milan Křepelka
Redaktor
Avatar
Odpovídá na jt.e
Milan Křepelka:

Vytunit to samozřejmě jde, ale spíš na úrovni OOP, programování přes rozhraní, DI apod.. S jazykem to nemá nic moc společného. S nějakými nepěkným vedlejšími efekty bys ses potýkal i na jiných platformách. To co chceš je prostě blbě tak nějak systémově.

Pokud bys měl nějakou výraznou společnou část která v tvém kódu je prezentována elementem něco. Potom "něco" by bylo vhodné odvelet to předka který by byl ve nějaké sdílené assembly(tedy v případě .NETu). Následně bys měl N potomků kteří by byly už v jiných projektech, každy jeden pro prezentační technologii - klienta. A v klientovi bys už "jenom" implementoval ty rozdíly které jsou specifické pro každého klienta.

Editováno 20.11.2015 18:10
 
Nahoru Odpovědět 20.11.2015 18:07
Avatar
Jakub Šárník:

Mě nějak uniká smysl takové funkce...

 
Nahoru Odpovědět 20.11.2015 18:59
Avatar
jt.e
Člen
Avatar
Odpovídá na Milan Křepelka
jt.e:

Původně jsem myslel něco, jako je třeba v C++ #ifdef UNICODE.., žádné složitosti.

Vaše reakce, jsem pochopil tak, že je třeba napsat kód tak, aby byl použitelný v "jakémkoliv" projektu a závislosti související s typem projektu, se řešili v konkrétním projektu. (krkolomně řečeno:) )

Editováno 20.11.2015 20:32
 
Nahoru Odpovědět 20.11.2015 20:30
Avatar
Ľuboš Čurgó
Redaktor
Avatar
Odpovídá na jt.e
Ľuboš Čurgó:

To akym sposobom printujes text zalezi od konkretnej technologie. Ked mas nejaky text ktory potrebujes vypisat tak si bud vies spravit jednoduchu triedu ktora bude obsahovat metody/property co vracaju dany text

class Program
   {
       static void Main(string[] args)
       {
           Console.WriteLine(PrintMessage.Test);
       }
   }

   public static class PrintMessage
   {
       public static string Test = "test";
   }

Avsak omnoho lepsie by bolo pridat taketo texty napriklad do resource filu. Otvoris properties v projekte, najdes resources tab, pridas novy file. Potom volas len.

static void Main(string[] args)
{
    Console.WriteLine(Resources.Test);
}
 
Nahoru Odpovědět 20.11.2015 22:08
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na jt.e
ostrozan:

Jsem to ale hlupák :-) - už jsem myslím pochopil, o co ti jde - a všichni tě tu zbytečně mateme, protože jsme úplně mimo.

to co pořebuješ se jmenuje přetížená metoda, případně přetížený konstruktor
pokud jsi řádně studoval zdejší tutorial, tak víš o čem je řeč

i když fakt nevím jak zrovna na tvůj příklad udělat přetíženou metodu

pokud by ses spokojil s něčím takovým - to samozřejmě není přetížená metoda - odpovídalo by to tvé univerzální "funkci":

class Vypis
{
public enum Dest{console,msgBox};
private void VypisText(string text, Dest kam)
        {
        switch(kam)
                 {
                 case console: Console.WriteLine(text);break;
                 case msgBox:  MessageBox.Show(text);
                  }
        }

}


Vypis vypis=new Vypis();
//vypis do konzole
vypis.VypisText("ahoj konzole",console);
//vypis do messageBoxu
vypis.VypisText("ahoj messageBoxi",msgBox);
 
Nahoru Odpovědět  +1 20.11.2015 22:11
Avatar
ostrozan
Redaktor
Avatar
ostrozan:

metoda VypisText má být samozřejmě** public**

 
Nahoru Odpovědět 20.11.2015 22:22
Avatar
Milan Křepelka
Redaktor
Avatar
Odpovídá na ostrozan
Milan Křepelka:

Jen si transformoval if do switche

 
Nahoru Odpovědět 21.11.2015 9:51
Avatar
Odpovídá na jt.e
Petr Čech (czubehead):

Pokud pomineme fakt, že je ta funkce z hlediska návrhu úplně špatně, tak sdílení kódu se dělá takto:

  • Vytvoř si nový projekt typu "Class library", tam si napíšeš kód, co chceš použít i jinde.
  • Otevřeš si solution s projektem, kde chceš daný kód použít.
  • V solution exploreru klikneš pravým na solution ne na projekt a vybereš "add > exisiting project"
  • Najdeš *.csproj soubor projektu s kódem na znovupoužití.
  • Pro jistotu "project > rebuild all"

Máš hotovo. Abys mohl kód používat, musíš pochopitelně přidat příslušný using.
To ale nemění nic na tom, že kód, který se uvedl, je špatně a neměl bys to dělat.

Nahoru Odpovědět 21.11.2015 10:44
Why so serious? -Joker
Avatar
jt.e
Člen
Avatar
Odpovídá na Petr Čech (czubehead)
jt.e:

Já jsem to blbě napsal, ve skutečnosti jsem to myslel tak, že při sestavení kompilátor rozhodne, kterou část kódu použije (teď chápu, že jsem tam to "if" neměl psát - to bylo zavádějící), ne že ta podmínka bude součástí budoucí aplikace.

Na mou otázku jste už odpověděli, a chápu, že kód musí být navržený jinak (v podstatě standardně - string předám třeba přes referenci v parametru).

 
Nahoru Odpovědět 21.11.2015 13:48
Avatar
Odpovídá na jt.e
Luboš Běhounek (Satik):

Asi myslíš preprocesorové direktivy, C# to samozřejmě má, ale dost omezené oproti C++
https://msdn.microsoft.com/…d8yd1ha.aspx

Nahoru Odpovědět 21.11.2015 13:54
:)
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na jt.e
ostrozan:

Takže jinak

ptáš se na:

  1. jak používat tvoji třídu v různých solutions ?

řešení ti potom dal czubehead výše

  1. jak zajistit, aby metoda stejného jména dělala různé věci?
  2. jak zjistit, v jakém typu aplikace se zrovna nacházíš?
  3. ani jedno z toho

Já osobně typuju b v kombinaci s c

 
Nahoru Odpovědět 21.11.2015 14:05
Avatar
ostrozan
Redaktor
Avatar
ostrozan:

Sakra, zase pozdě :)

 
Nahoru Odpovědět 21.11.2015 14:13
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 17 zpráv z 17.