360 likes | 532 Views
Značaj metoda u projektovanju softvera. Metodi predstavljaju male dobro definisane delove softvera – procedure, funkcije koji imaju svoje ime i koji rešavaju jedan dobro definisan deo ukupnog problema Ime metoda treba da je dobro odabrano i da ukazuje na funkciju koju obavlja
E N D
Značaj metoda u projektovanju softvera • Metodi predstavljaju male dobro definisane delove softvera – procedure, funkcije koji imaju svoje ime i koji rešavaju jedan dobro definisan deo ukupnog problema • Ime metoda treba da je dobro odabrano i da ukazuje na funkciju koju obavlja • Dobro projektovan softver ima metode koji olakšavaju sagledavanje i razumevanje problema • Šire gledano, softver predstavlja vernu kopiju objektivne stvarnosti – procesa iz realnosti koje podržava
Značaj metoda u projektovanju softvera • Projektovani metodi treba da budu što više međusobno nezavisni, jer se na taj način problem može dekomponovati na jednostavnije probleme koji se rešavaju metodima • Da bi se metodom mogao modelovati neki deo problema, neophodno je da se metodom mogu implementirati tri osnovne programske strukture: • Sekvenca • Selekcija • Iteracija • Može se dokazati da se kombinacijom ove tri elementarne programske strukture može implementirati bilo kakva složena struktura • To je osnovna postavka tzv. “strukturnog programiranja” • Strukturno programiranje je poznata programska paradigma – princip , pre pojave OOP
Logički – Boolean tip podataka • Logički tip podataka je još jedan tip podataka u odnosu na tipove podataka pomenute u prethodnom poglavlju • Logički tip podataka je binarni tip koji ima samo dve vrednosti – true i false • Ovaj jednostavni tip podataka ima velikog značaja za realizovanje programskih struktura selekcije i iteracije • Logičkom tipu podataka odgovaraju promenljive tog tipa • U svakom programskom jeziku postoje naredbe koje proveravaju – testiraju logičku vrednost izraza
Logički – Boolean tip podataka • Deklaracija logičke promenljive • bool areYouReady; • areYouReady = true; • Console.WriteLine(areYouReady); // writes True • areYouReady je promenljiva tipa boolean • Vrednost bilo koje logičke promenljive može biti true ili false
Logički – Boolean operatori • Logički operatori vrše logičke operacije sa logičkim vrednostima i daju takođe logičke vrednosti kao rezultate tih operacija • Osnovni logički operatori su AND (I), OR (ILI) i NOT (NE) • Ovi operatori se u C#-u sintaksno nešto drugačije označavaju – isto kao i u ostalim C-olikim jezicima • AND -> && - binarni operator (dva argumenta - operanda) • OR -> || - binarni operator • NOT -> ! – unarni operator (jedan argument – operand ) • Operacijesanavedenimlogičkimoperatorimasudefinisanesa odgovarajućim tabelama istinitosti
Relational – relacioni operatori • Relacioni operatori postoje u svim programskim jezicima i koriste se za testiranje odnosa između neke dve vrednosti • Ovi operatori se ne primenjuju na logičke vrednosti već na tipove kao što su int, float, long, double, string, itd... ali kao rezultat daju logičke vrednosti • Operator provere jednakosti se obeležava sa “==“ da bi se pouzdano razlikovao od operatora dodele vrednosti “=“ • Postoje situacije kada se operatori “==“ i “=“ greškom mogu pomešati – zameniti jedan drugim što predstavlja semantičku grešku, ali se takvi slučajevi mogu otkriti na osnovu konteksta za vreme kompajliranja i prijaviti kao sintaksna greška
Logički i relacioni operatori • Logički i relacioni operatori se mogu kombinovati radi dobijanja potrebnih složenih izraza • Pri tome se rezultati relacionih operatora koji daju logičke vrednosti, kombinuju sa logičkim operatorima • Logičke vrednosti relacionih operatora u tom slučaju predstavljaju argumente – operande logičkih operatora • bool validPercentage; • validPercentage = (percent >= 0) && (percent <= 100);
Precedence – prioritet logičkih i relacionih operatora • Prioritet relacionih operatora je veći nego prioritet logičkih operatora • validPercentage = percent >= 0 && percent <= 100 • Iz prethodnog izraza se vidi da je ovakav prioritet logičan, jer drugačije ne može ni da bude, pošto logički operatori ne mogu da deluju na operande relacionih operatora koji nisu logičkog tipa • Ako prioritet operatora ne može da obezbedi željeni redosled operacija, koriste se zagrade kojima se eksplicitno određuje redosled operacija • validPercentage = (percent >= 0) && (percent <= 100)
Short circuiting – prečice za brzo određivanje logičkih izraza • U određenim slučajevima, određivanje vrednosti logičkih izraza sa logičkim operatorima AND i OR se može vršiti po skraćenom postupku, što se naziva – short circuiting (kratak spoj, kratko spajanje u doslovnom prevodu) • Ako je prvi operand operatora “&&” “false”,onda je rezultat takođe “false” nezavisno od logičke vrednosti drugog operanda. Zašto? • Ako je prvi operand operatora “||” “true” onda je rezultat takođe “true” nezavisno od logičke vrednosti drugog operanda. Zašto?
Short circuiting – prečice za brzo određivanje logičkih izraza • (percent >= 0) && (percent <= 100) • (percent < 0) || (percent > 100) • Pažljivimdizajniranjemlogičkih izraza, mogu se poboljšati performanse programa pri određivanju vrednosti logičkih izraza, tako da se u određenim slučajevima ne mora odrediti vrednost čitavog izraza • Kod složenijih izraza, performanse programa se mogu poboljšati tako da se na početku određuju vrednosti jednostavnijih izraza, koji pod određenim uslovima – navedenim, mogu da odrede vrednost čitavog složenog izraza, tako da nije potrebno određivanje vrednosti složenijeg dela izraza
If statement – naredba za selekciju • Osnovna sintaksa if naredbe je • if ( booleanExpression ) • statement-1; • else • statement-2; • “else” i “statement-2” su proizvoljni i mogu se izostaviti • Za razliku od C i C++ - a, unutar zagrada se MORA nalaziti isključivo logički – boolean izraz • C i C++ numeričke vrednosti različite od nule tretiraju kao “true”, a nulu kao “false”
If statement – naredba za selekciju • int seconds; • ... • if (seconds = 59) // compile-time error • ... • if (seconds == 59) // ok • Ako se greškom operator “==“ zameni sa “=“, C# compiler to detektuje kao grešku, tj. semantičku grešku detektuje kao sintaksnu na osnovu konteksta i zahteva da u zagradama if() naredbe može da budu SAMO logički izraz • U C i C++ - u bi to prošlo sasvim neopaženo za compiler, jer su dozvoljene i numeričke vrednosti
If statement – naredba za selekciju • boolinWord; • ... • if (inWord == true) // ok, but not commonly used • ... • if (inWord) // better • Logički izraz može biti i samo jedna logička vrednost, tj. testiranje jednakosti na “true” i “false” se može zameniti sa logičkim izrazom od samo jedne promenljive
Blok koda – grupisanje naredbi {} • int seconds = 0; • int minutes = 0; • ... • if (seconds == 59) • { • seconds = 0; • minutes++; • } • else • seconds++; • Blok kodaizmeđu zagrada “{“ i “}” takođe predstavlja opseg – scope važenja promenljivih • Ako bi se zagrade “{“ i “}” u gornjem primeru izostavile, prijavila bi se sintaksna greška. Zašto?
Cascading if statements – ugneždene if naredbe • if (day == 0) • dayName = “Sunday”; • else if (day == 1) • dayName = “Monday”; • else if (day == 2) • dayName = “Tuesday”; • else if (day == 3) • dayName = “Wednesday”; • else if (day == 4) • dayName = “Thursday”; • else if (day == 5) • dayName = “Friday”; • else if (day == 6) • dayName = “Saturday”; • else • dayName = “unknown”;
Neispravno pokazivanje – zašto? • private intcompareClick(object sender, RoutedEventArgs e) • { • int diff = dateCompare(first.Value, second.Value); • info.Text = “”; • show(“first == second”, diff == 0); • show(“first != second”, diff != 0); • show(“first < second”, diff < 0); • show(“first <= second”, diff <= 0); • show(“first > second”, diff > 0); • show(“first >= second”, diff >= 0); • }
Razlog... • private intdateCompare(DateTimeleftHandSide, DateTimerightHandSide) • { • // TO DO • return 42; • } • Kako bi trebalo? • private intdateCompare(DateTimeleftHandSide, DateTimerightHandSide) • { • int result; • if (leftHandSide.Year < rightHandSide.Year) • result = -1; • else if (leftHandSide.Year > rightHandSide.Year) • result = +1; • }
Šta je još potrebno? • private int dateCompare(DateTime leftHandSide, DateTime rightHandSide) • { • ... • else if (leftHandSide.Month < rightHandSide.Month) • result = -1; • else if (leftHandSide.Month > rightHandSide.Month) • result = +1; • } • Ako su godine iste, porede se datumi. Zašto? • Ako godine nisu iste, nije potrebno porediti datume
I dalje ... • private intdateCompare(DateTimeleftHandSide, DateTimerightHandSide) • { • ... • else if (leftHandSide.Day < rightHandSide.Day) • result = -1; • else if (leftHandSide.Day > rightHandSide.Day) • result = +1; • else • result = 0; • return result; • }
Poređenje datuma može i drugačije - jednostavnije • Klasa DateTime ima statički metod Compare za poređenje datuma • Korišćenjem metoda Compare, poređenje je krajnje jednostavno • private intdateCompare(DateTimeleftHandSide, DateTimerightHandSide) • { int result = DateTime.Compare(leftHandSide, rightHandSide); • return result; • }
Switch statement – zamena za ugneždeni if • switch ( controllingExpression ) • { • case constantExpression : • statements • break; • case constantExpression : • statements • break; • ... • default : • statements • break; • }
Switch primer • switch (day) • { • case 0 : • dayName = “Sunday”; • break; • case 1 : • dayName = “Monday”; • break; • case 2 : • dayName = “Tuesday”; • break; • ... • default : • dayName = “Unknown”; • break; • }
Ograničenja za switch • Switch se može koristiti samo sa jednostavnim tipovima kao što su “int” ili “string” za tip podataka čija se vrednost ispituje • Vrednosti iza case - labele ili oznake, moraju biti konstantne – na pr. 42 ili “42” • Labele moraju biti različite • “Propadanje” - može se navesti isti izraz za više od jedne labele, ali samo jednom - • Ako se isti izraz navede više puta bez “break”, prijavljuje se greška tokom kompajliranja
Switch fall-through - “Propadanje “kroz switch • switch (trumps) • { • case Hearts : • case Diamonds : // Fall-through allowed – no code between labels • color = "Red"; // Code executed for Hearts and Diamonds • break; • case Clubs : • color = "Black"; • case Spades : // Error – code between labels • color = "Black"; • break; • }
Ograničenja za switch fall-through “propadanje” kroz switch • Ukoliko se navede kod iza labele, neophodno je navesti i “break” inače se dobija greška kompajliranja • To je odlično, jer se na taj način upozorava na sitaksnu grešku, što nije bio slučaj u C i C++ - u, gde se izostavljanjem “break” koji nije obavezan automatski “propada” kroz kod, što možda nije željeno ponašanje jer je slučajno zaboravljen “break” • C i C++ verzija switch - a se može simulirati sa goto label i label: • Generalno, korišćenje naredbe goto je loše osim u izuzetnim slučajevima, zbog čega ipak postoji goto
Primer za switch (1) • private void copyOne(char current) • { • switch (current) • { • case '<' : • target.Text += "<"; • break; • case '>': • target.Text += ">"; • break; • case '&': • target.Text += "&"; • break; • case '\"': • target.Text += """; • break;
Primer za switch (2) • case '\'': • target.Text += "'"; • break; • default: • if (current < 127) • target.Text += current; • else • { • target.Text += "&#"; • string code = ((int)current).ToString(); • target.Text += code; • target.Text += ";"; • } • break; • }