Anonymní profil GoogleMan – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil GoogleMan – Programujte.comAnonymní profil GoogleMan – Programujte.com

 

Příspěvky odeslané z IP adresy 88.212.40.–

Fazula
.NET › Navrh aplikacie
16. 6. 2011   #143245

Necital si o MVC modeli? Pretoze OOP s tym vela spolocneho nema (aj ked vies OOP vyzit v MVC - zalezi od charakteru ulohy).

Spravidla pre mini aplikacie by si mal oddelit graficke rozhranie a business logiku. Business logika moze byt zapuzdrena v DB / odelena / alebo zdielana. Uplne postaci ak teda oddelis logiku - s cim aj tak vacsina programatorov ma problem, vyextrahovat logiku.

Ak zmyslom aplikacie je napr. komunikovat s nejakym serverom, treba oddelit (alebo zapuzdrit) komunikacnu logiku. Potom vytvorit vseobence rozhranie, co moze byt trieda, ale aj sada statickych metod. Tie preberu udaje z aplikacie a transformuju ich tak, aby sluzba vedela komunikovat so serverom. Vyhodou takehoto pristupu je, ze ak zmenis napr. server (providera / sluzbu / etc.) tak upravujes vzdy len jednu vrstvu. Interface by mal ostat nemenny, cim minimalizujes rizika dopadu takejto zmeny len na komunikaciu (tester uz nemusi znova testovat GUI).

Ak mas takto poodelovanu logiku, vies potom pisat unit testy aj na komplexnejsie ulohy (bez toho aby si vymyslal kde-ake somariny s klikanim mysky po screene). Taktiez takyto kod ak je dobre napisany, je v podstate okamzite znovapouzitelny v inom systeme (prave extrakcia rozhrania a logiky je kumst), cim mozes setrit cas a prostriedky pri vyvoji obdobneho systemu (vyuzivajuci len jednu cast).

V pripade databazy je zasa jednoduchsie migrovat na iny system - vzdy prepises len "ovladac", aplikacie by sa to mohlo dotknut len minimalne.

Ak mas teda logiku rozlezenu po celej aplikacii (GUI / kod / DB) je potom zlozitejsie takyto system rozsirovat a pracovat v teame - pretoze je tazke odhadnut dopad akejkolvek zmeny pre cloveka, ktory danu cast nenavrhoval.

Bambulka
.NET › foreach a projiti objektu
21. 5. 2011   #142362

1/ Namiesto tohto:



private int carovykod;
public int Carovykod
{
get { return carovykod; }
set { carovykod = value; }
}


mozes kludne pouzit toto:




public int Carovykod
{
get;
/*???*/private set;
}


2/ Ten objekt je vlastne jeden zaznam, nikde nepises, aky mas zdroj - ako priklad mozes pouzit genericky List:



public class Zaznam
{
public string Meno { get; private set; }
public string Priezvisko { get; private set; }

public Zaznam(string meno, string priezvisko)
{
Meno = meno;
Priezvisko = priezvisko;
}
}

...

List<Zaznam> zoznamZaznamov = new List<Zaznam>();
zoznamZaznamov.Add(new Zaznam("Janko", "Hrasko"));
zoznamZaznamov.Add(new Zaznam("Peter", "Pan"));
zoznamZaznamov.Add(new Zaznam("Macko", "Pu"));

...



3/ Ak takyto zoznam chces zobrazit cez foreach (preco cez cyklus?) tak to mozes urobit napr takto:



foreach (Zaznam aktualnyZaznam in zoznamZaznamov)
{
string zobrazitText = aktualnyZaznam.Meno + " " + aktualnyZaznam.Priezvisko;

listBox1.Items.Add(zobrazitText);
}


4/ Lepsie je overridnut v tvojej triede (zaznam) ToString() - to bude to, co sa ti zobrazi v zozname - a list priamo vlozis ako zdroj pre ListBox (budes tam mat potom smernik na tvoju triedu a tak napr. pri oznaceni si mozes SelectedItem pretypovat na tvoj zaznam:




using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
// Nejaky zoznam
private List<Zaznam> zoznamZaznamov = new List<Zaznam>()
{
{ new Zaznam("Janko", "Hrasko", 1986) },
{ new Zaznam("Peter", "Pan", 1987) },
{ new Zaznam("Macko", "Pu", 1988) }
};

public Form1()
{
InitializeComponent();

listBox1.DataSource = zoznamZaznamov; // Priradime zdroj
}

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
Zaznam oznacenyZaznam = (listBox1.SelectedValue as Zaznam); // Vieme sa dostat ku instancii zo zoznam

MessageBox.Show("Narodeny: " + oznacenyZaznam.RokNarodenia.ToString());
}
}

public class Zaznam
{
public string Meno { get; private set; }
public string Priezvisko { get; private set; }
public int RokNarodenia { get; private set; }

public Zaznam(string meno, string priezvisko, int rokNarodenia)
{
Meno = meno;
Priezvisko = priezvisko;
RokNarodenia = rokNarodenia;
}

public override string ToString()
{
return Meno + " " + Priezvisko; // Toto sa bude zobrazovat v listboxe
}
}

}

GoogleMan
.NET › Silverlight - dataBinding
10. 5. 2011   #141780

Neviem co chces konretne robit - ale ak mu das Name tak s kazdym komponentom vytvorenom v XAML (design-time) vies nakladat za behu aplikacie (CS subor a run-time).

GoogleMan
.NET › Silverlight nacitanie suboro…
10. 5. 2011   #141779

Zle polozena otazka - predkladas riesenie, ale nemusi byt najlepsie (nevieme naco to chces pouzit).

Ostatne preco nepouzit SOAP - cez SL klienta zavolas routinu na serveri a ta ti vrati obsah / nazvy. Musis si to predstavit aj z hladiska architekturi - SL klient bezi na prehliadaci niekomu v Cine. Chces aby ten manik mal pristup na disk na tvojom serveri? Asi nie - takze to treba rucne odmakat (co klient moze / nemoze vidiet) kde server ti zapuzdri business logiku a komunikacia prebehne cez SOAP.

Ak to je samostatna SL aplikacia bez servera - musis riesit prava, ktore adresare su vlastne "viditelne".

GoogleMan
.NET › ASP.NET a Silverlight
10. 5. 2011   #141778

http://www.dotnetspider.com/Silverlight-Tutorial-313.aspx

JankoHrasko
.NET › [C#] kontrola uzávorkování
8. 5. 2011   #141700



using System;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public static readonly string[] SadyZatvoriek = { "{}", "()", "[]", "<>" };

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
// Pokus 1
string text = "blabla () bla [ { }] bla {\nbla}";
int? chybnyIndex = KontrolujZatvorky(text);
MessageBox.Show(text + " -> " + (chybnyIndex.HasValue ? chybnyIndex.ToString() : "OK"));

// Pokus 2
text = "({{})";
chybnyIndex = KontrolujZatvorky(text);
MessageBox.Show(text + " -> " + (chybnyIndex.HasValue ? chybnyIndex.ToString() : "OK"));

// Pokus 3
text = "({}";
chybnyIndex = KontrolujZatvorky(text);
MessageBox.Show(text + " -> " + (chybnyIndex.HasValue ? chybnyIndex.ToString() : "OK"));

// Pokus 4
text = "bla }";
chybnyIndex = KontrolujZatvorky(text);
MessageBox.Show(text + " -> " + (chybnyIndex.HasValue ? chybnyIndex.ToString() : "OK"));
}

public static int? KontrolujZatvorky(string text)
{
string zasobnikZatvoriek = string.Empty;
int index = 0;

foreach (char aktualnyZnak in text)
{
if (JeOtvaraciaZatvorka(aktualnyZnak))
zasobnikZatvoriek += aktualnyZnak;
else if (JeUzatvaraciaZatvorka(aktualnyZnak))
{
// Uzatvaracia zatvorka bez otvaracej
if (string.IsNullOrEmpty(zasobnikZatvoriek))
return index + 1;

// Porovnat ci sa jedna o rovnaku sadu
char poslednaOtvaraciaZatvorka = zasobnikZatvoriek[zasobnikZatvoriek.Length - 1];
if (!SuZatvorkyZhodne(poslednaOtvaraciaZatvorka, aktualnyZnak))
return index + 1;

// Su zhodne zatvorky - vybrat zo zasobnika
zasobnikZatvoriek = zasobnikZatvoriek.Substring(0, zasobnikZatvoriek.Length - 1);
} // else if

index++;
} // foreach

if (string.IsNullOrEmpty(zasobnikZatvoriek))
return null;

return text.Length + 1; // Chyba zatvorka (dalsi znak tam mal byt)
}

public static bool JeOtvaraciaZatvorka(char znak)
{
foreach (string sada in SadyZatvoriek)
{
if (sada[0] == znak)
return true;
} // foreach

return false;
}

public static bool JeUzatvaraciaZatvorka(char znak)
{
foreach (string sada in SadyZatvoriek)
{
if (sada[1] == znak)
return true;
} // foreach

return false;
}

public static bool SuZatvorkyZhodne(char otvaraciaZatvorka, char zatvaraciaZatvorka)
{
foreach (string sada in SadyZatvoriek)
{
if (sada[0] == otvaraciaZatvorka)
return (sada[1] == zatvaraciaZatvorka);
} // foreach

return false; // Znak nie je zo ziadnej sady
}
}
}

LiborBes
.NET › Šifrování textového souboru
12. 5. 2010   #128818

A co tak skusit google, hned prvy vysledok:

http://sharpertutorials.com/calculate-md5-checksum-file/

ak sa jedna napr. o log subor a ty na serveri v nejakom threade ho sledujes - kludne si len odpamataj z IO datum poslednej zmeny suboru...

LiborBes
.NET › Polymorfismus - dostupnost t…
25. 4. 2010   #127769

To Petrroll :

Ono to je normalne, dvolezite je rozhranie - to co je zapuzdrene v triede ta nezaujima. Ak by si z "cicavca" urobil abstraktnu triedu tvoj priklad by fungoval. Otazka by nasledovala, ze preco? Ved nikdy by si nevedel urobit instanciu z abstraktnej triedy "new Savec()". Ako je mozne zeby to fungovalo?

Z hladiska "kompilacie" je zaujimave rozhranie. Ak vytvaras bazicku triedu, vies volat (priamo) len bazicke cleny. Ak je vsak trieda od nej odvodena (implementuje bazicke cleny => kompilator si je isty len nimi) mozes ich volat, nevies vsak zavolat priamo veci implementovane v odovdenej triede (neznamena, ze neexistuju!!!).

Cele OOP je v tomto pripade postavene na zaklade smernikov. Ten objekt (instancia) je len odkaz, kde sa data v pamati nachadzaju a ako sa da s nimi pracovat - kompilatoru si povedal, ze si si isty, ze tam je nejaky cicavec (nie vsak aky). Preto v kode vies pracovat len s tym, co "ponuka" cicavec - ale v pamati budes mat vytvoreneho "celeho" kona.

Tvoj priklad vies upravit:

[CODE]
object neoSavec = new Kun();
[/CODE]

Kazda trieda je odvodena od triedy "object" - to znamena, ze aj kona vies vytvorit v premennej object (pretoze cicavec je vlastne odovdeny od object). Problem je v tom, ze teraz neoSavec pre kompilator definuje len vlastnosti objektu - aj ked ty vies, ze sa tam nachadza kon (fyzizky v pamati). Takze vies velmi jednoducho pretypovat instanciu na tebou pozadovanu a tak vynutit kompilatoru co ty vies, ze je pravda:

[CODE]
object neoInstancia = new Kun(); // IBA JEDINA INSTANCIA
neoInstancia.Jez(); // CHYBA: object nepozna metodu Jez aj ked existuje v run-time

((Savec)neoInstancia).Jez(); // FUNGUJE (vynutili sme typ o ktorom vieme ze funguje)
((Savec)neoInstancia).JezTravu(); // CHYBA: Savec nepozna metodu aj iked existuje v run-time (rovnaka chyba ako hore)

((Kon)neoInstancia).Jez(); // FUNGUJE
((Kon)neoInstancia).JezTravu(); // FUNGUJE - typ KON definuje aj tuto metodu

((TextBox)neoInstancia).Text = "Text"; // CHYBA: V pamati sa nenachadza instancia TextBox - ale kompilator to nevie, toto zdochne len za behu programu - rovnako kompilator si "nie je isty" predchadzajucim pretypovanim - toto je totiz na tebe
[/CODE]

Zhrnute a podciarknute:
Neplet si run-time a rozhranie. V konecnom dosledku to, ze ty metody "nevidis" neznamena, ze tam nie su. Na vytvorenie instancie kona si pouzil predka z nizsej urovne, preto nemozes vidiet jeho metody. Vidis len tu, ktora je definovana v predkovi a to, ze ona (interne v pamati) vola nieco o com ty nevies v kode, to je v tomto pripade irelevantne.

LiborBes
.NET › C# - oracle database a Neoše…
8. 12. 2009   #120849

No a na ktorom riadku ti to zdochne? S Oracle sice nemam skusenosti a nepoznam ten driver, ale MSSQL ci Sybase by toto zozral:

[CODE]
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));User Id=sys;Password=******;";

using (OracleConnection connection = new OracleConnection(connectionString))
{
connection.Open();
using (OracleCommand command = new OracleCommand(
"SELECT Priezvisko FROM Jmena", connection))
{
OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
if (!reader.Read())
throw new Exception("Data neexistuju!");

string priezvisko = reader.GetString(0);
Console.WriteLine(priezvisko);
} // using
} // using
[/CODE]

LiborBes
JavaScript, AJAX, jQuery › Přepínání mezi taby prohlíže…
9. 11. 2009   #118806

Ono to cez ten Focus ide, aj ked je to proti vsetkej logike tenkych klientov. Implicitne to ma povolene IE (ako inac) cez fciu focus() - v premennej sa da drzat otvorene okno a da sa determinovat aj jeho pripadne zavretie cez xyz.closed property. Vo Firefoxe to je implicitne zakazane, ale je to vecou nastaveni. Nezda sa mi ale velmi user friendly diktovat uzivatelovi nastavenia vlastneho prehliadaca...

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032022 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý