You are on page 1of 31

Podstawy modelowania programów —

Wykład 1

dr inż. Łukasz Hładowski∗


∗ Instytut Sterowania i Systemów Informatycznych
Uniwersytet Zielonogórski

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 1/ 31
Zasady poprawnego pisania programów

1 Sensowne nazwy funkcji i zmiennych


2 Wartości domyślne
3 Poprawne tworzenie obiektów
4 Gettery i settery
5 Wyjątki
6 Dziedziczenie vs. instanceof
7 Zależności między klasami
8 Przedwczesna optymalizacja

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 2/ 31
Sensowne nazwy funkcji i zmiennych

1 public static void main ( String [] args ) {


2 int l =2; int o =3; int O = -1;
3 for ( int i = 0; i < l +2*0+3; i ++){
4 System . out . print ( l + i +1+ l -1* O * o + l * O );
5 System . out . println ( " ) bledzik " );
6 System . out . println ( " ... poprawiony " );
7 }
8 }

Co się wypisze?

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 3/ 31
Rozwiązanie

1 6) bledzik
2 ... poprawiony
3 7) bledzik
4 ... poprawiony
5 8) bledzik
6 ... poprawiony
7 9) bledzik
8 ... poprawiony
9 10) bledzik
10 ... poprawiony

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 4/ 31
Sensowne nazwy funkcji i zmiennych

1 public static void main ( String [] args ) {


2 int x =2; int y =3; int p = -1;
3 for ( int q = 0; q < x +2*0+3; q ++)
4 System . out . print ( x + q +1+ x -1* p * y + x * p );
5 System . out . println ( " ) bledzik " );
6 System . out . println ( " ... poprawiony " );
7 }

Czy teraz nie jest trochę łatwiej?

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 5/ 31
Rozwiązanie

1 678910) bledzik
2 ... poprawiony

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 6/ 31
’Ukochane’ nazwy...
1 public class Main {
2 static int x ;
3 public static void f (){
4 if (++ x ==1) {
5 System . out . println ( " ) bledzik " );
6 } else {
7 System . out . println ( " ... poprawiony " );
8 }
9 }
10 public static void f ( int x ){
11 f (); System . out . print ( x );
12 }
13 public static void main ( String [] args ) {
14 int x =0; f ( x ); f ();
15 }
16 }

A teraz co?
Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 7/ 31
Rozwiązanie

1 ) bledzik
2 0... poprawiony

Czy można poprawić ten kod?

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 8/ 31
Refaktoryzacja 1 — zmiana nazw i wart. pocz.
1 public class Main {
2 static int LiczbaWyswietlen =0; /* oczywiste ! */
3 public static void WyswietlTekst (){
4 if (++ LiczbaWyswietlen ==1) {
5 System . out . println ( " ) bledzik " );
6 } else { System . out . println ( " ... poprawiony " );}
7 }
8 public static void WyswietlLiczbe ( int liczba ){
9 WyswietlTekst ();
10 System . out . print ( liczba );
11 }
12 public static void main ( String [] args ) {
13 int liczba =0;
14 WyswietlLiczbe ( liczba );
15 WyswietlTekst ();}}

Nadal źle, ale chociaż trochę czytelniej...


Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 9/ 31
Refaktoryzacja 2 — wyrzucenie funkcji WyswietlTekst

poza WyswietlLiczbe
1 public class Main {
2 static int LiczbaWyswietlen = 0;
3 public static void WyswietlTekst (){
4 if (++ LiczbaWyswietlen ==1) {
5 System . out . println ( " ) bledzik " );
6 } else { System . out . println ( " ... poprawiony " );}
7 }
8 public static void WyswietlLiczbe ( int liczba ){
9 System . out . print ( liczba );
10 } /* USUNIĘTA */
11 public static void main ( String [] args ) {
12 int liczba =0;
13 WyswietlTekst (); /* DODANA */
14 WyswietlLiczbe ( liczba );
15 WyswietlTekst (); }}
Łukasz Hładowski
Po co nam WyswietlLiczbe?
Podstawy modelowania programów — Wykład 1 10/ 31
Wynik

1 public class Main {


2 static int LiczbaWyswietlen = 0;
3 public static void WyswietlTekst (){
4 if (++ LiczbaWyswietlen ==1) {
5 System . out . println ( " ) bledzik " );
6 } else { System . out . println ( " ... poprawiony " );}
7 }
8 public static void main ( String [] args ) {
9 int liczba =0;
10 WyswietlTekst ();
11 System . out . print ( liczba );
12 WyswietlTekst (); }}

WyswietlTekst jest trudna! Upraszczamy...

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 11/ 31
Refaktoryzacja 3 — funkcja WyswietlTekst

1 [...]
2 public static void WyswietlTekst (){
3 if (++ LiczbaWyswietlen ==1) {
4 System . out . println ( " ) bledzik " );
5 } else {
6 System . out . println ( " ... poprawiony " );
7 }
8 }
9 [...]

Co zrobić z tym ++LiczbaWyswietlen?

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 12/ 31
Refaktoryzacja 3a — zastępujemy ++x kodem
równoważnym

1 [...]
2 public static void WyswietlTekst (){
3 LiczbaWyswietlen ++;
4 if ( LiczbaWyswietlen ==1) {
5 System . out . println ( " ) bledzik " );
6 } else {
7 System . out . println ( " ... poprawiony " );
8 }
9 }
10 [...]

... nie zawsze to będzie dobry wybór...

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 13/ 31
Refaktoryzacja 3b — upraszczamy
if (LiczbaWyswietlen==1) kodem równoważnym

1 public static boolean C z y P i e r w s z e W y s w i e t l e n i e () {


2 if ( LiczbaWyswietlen ==1) {
3 return true ;
4 } else {
5 return false ;
6 }
7 }
8 public static void WyswietlTekst (){
9 LiczbaWyswietlen ++;
10 if ( C z y P i e r w s z e W y s w i e t l e n i e ()) {
11 System . out . println ( " ) bledzik " );
12 } else {
13 System . out . println ( " ... poprawiony " );
14 }
15 }
Łukasz
16 [...]
Hładowski
Podstawy modelowania programów — Wykład 1 14/ 31
Refaktoryzacja 3b prim — przenosimy LiczbaWyswietlen

na koniec
1 [...]
2 public static void WyswietlTekst (){
3 if ( LiczbaWyswietlen ==0) {
4 System . out . println ( " ) bledzik " );
5 } else {
6 System . out . println ( " ... poprawiony " );
7 }
8 LiczbaWyswietlen ++;
9 }
10 [...]

Dlaczego warto to zrobić? Czy to rozwiązanie jest sensowniej-


sze?

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 15/ 31
Refaktoryzacja 3c — przenosimy LiczbaWyswietlen poza
WyswietlTekst

1 [...]
2 public static void WyswietlTekst (){
3 if ( LiczbaWyswietlen ==0) {
4 System . out . println ( " ) bledzik " );
5 } else { System . out . println ( " ... poprawiony " );}
6 public static void main ( String [] args ) {
7 int liczba =0;
8 WyswietlTekst ();
9 LiczbaWyswietlen ++; /* DODANA */
10 WyswietlLiczbe ( liczba );
11 WyswietlTekst ();
12 LiczbaWyswietlen ++; /* Dlaczego 2 raz ? */
13 } } [...]

Dlaczego warto to zrobić?


Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 16/ 31
Refaktoryzacja 3d — Zastępujemy println czymś
sensowniejszym
1 [...]
2 public static void W y s w i e t l I n f o r m a c j e O B l e d z i e () {
3 System . out . println ( " ) bledzik " ); }
4 public static void W y s w i e t l I n f o r m a c j e O P o p r a w c e () {
5 System . out . println ( " ... poprawiony " ); }
6 public static void WyswietlTekst (){
7 if ( LiczbaWyswietlen ==0) {
8 W y s w i e t l I n f o r m a c j e O B l e d z i e ();
9 } else {
10 W y s w i e t l I n f o r m a c j e O P o p r a w c e ();
11 }
12 }

Dlaczego warto to zrobić?

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 17/ 31
W main usuwamy zbędne LiczbaWyswietlen++;

1 [...]
2 public static void main ( String [] args ) {
3 int liczba =0;
4 WyswietlTekst ();
5 LiczbaWyswietlen ++;
6 System . out . print ( liczba );
7 WyswietlTekst ();
8 /* LiczbaWyswietlen ++; --- USUNIETA */
9 }

Dlaczego warto to zrobić?

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 18/ 31
Refaktoryzacja 4 — Usuwamy WyswietlTekst

1 static int LiczbaWyswietlen = 0;[...]


2 public static void main ( String [] args ) {
3 int liczba =0;
4 if ( LiczbaWyswietlen ==0) {
5 W y s w i e t l I n f o r m a c j e O B l e d z i e ();
6 } else {
7 W y s w i e t l I n f o r m a c j e O P o p r a w c e ();
8 }
9 LiczbaWyswietlen ++;
10 System . out . print ( liczba );
11 if ( LiczbaWyswietlen ==0) {
12 W y s w i e t l I n f o r m a c j e O B l e d z i e ();
13 } else {
14 W y s w i e t l I n f o r m a c j e O P o p r a w c e ();
15 }
16 }

Dlaczego warto to zrobić?


Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 19/ 31
Refaktoryzacja 5 — Przeciez LiczbaWyswietlen=0 !
1 static int LiczbaWyswietlen = 0;[...]
2 public static void main ( String [] args ) {
3 int liczba =0; /* USUWAM TEGO IF ’a */
4 /* if ( LiczbaWyswietlen ==0) { --- WON ! */
5 W y s w i e t l I n f o r m a c j e O B l e d z i e ();
6 /* } else { */
7 /* W y s w i e t l I n f o r m a c j e O P o p r a w c e (); */
8 /* } */
9 LiczbaWyswietlen ++;
10 System . out . print ( liczba );
11 if ( LiczbaWyswietlen ==0) {
12 W y s w i e t l I n f o r m a c j e O B l e d z i e ();
13 } else {
14 W y s w i e t l I n f o r m a c j e O P o p r a w c e ();
15 }
16 }

Dlaczego warto to zrobić?


Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 20/ 31
Refaktoryzacja 5 — Wynik
1 static int LiczbaWyswietlen = 0;[...]
2 public static void main ( String [] args ) {
3 int liczba =0;
4 W y s w i e t l I n f o r m a c j e O B l e d z i e ();
5 LiczbaWyswietlen ++;
6 System . out . print ( liczba );
7 if ( LiczbaWyswietlen ==0) {
8 W y s w i e t l I n f o r m a c j e O B l e d z i e ();
9 } else {
10 W y s w i e t l I n f o r m a c j e O P o p r a w c e ();
11 }
12 }

Tak samo robię z drugim if’em


UWAGA! Teraz LiczbaWyswietlen=1!
Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 21/ 31
Refaktoryzacja 6 — Usuwam niepotrzebną
zmienną LiczbaWyswietlen

1 /* static int LiczbaWyswietlen = 0; --- WON ! */


2 public static void main ( String [] args ) {
3 int liczba =0;
4 W y s w i e t l I n f o r m a c j e O B l e d z i e ();
5 System . out . print ( liczba );
6 W y s w i e t l I n f o r m a c j e O P o p r a w c e ();
7 }
8 }

Im prostszy kod, tym lepiej!

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 22/ 31
Refaktoryzacja 7 — liczba przecież należy do
informacji o błędzie!
1 /* PRZED */
2 public static void
3 W y s w i e t l I n f o r m a c j e O B l e d z i e () {
4 System . out . println ( " ) bledzik " ); }
5
6 public static void main ( String [] args ) {
7 int liczba =0;
8 W y s w i e t l I n f o r m a c j e O B l e d z i e ();
9 System . out . print ( liczba );
10 W y s w i e t l I n f o r m a c j e O P o p r a w c e ();
11 }
12 }

Dlaczego ten kod jest błędny? Przecież się kompiluje!


Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 23/ 31
Refaktoryzacja 7 — Wynik

1 public static void


2 W y s w i e t l I n f o r m a c j e O B l e d z i e ( int liczba ) {
3 System . out . print ( liczba );
4 System . out . println ( " ) bledzik " );
5 }
6
7 public static void main ( String [] args ) {
8 int liczba =0;
9 W y s w i e t l I n f o r m a c j e O B l e d z i e ( liczba );
10 W y s w i e t l I n f o r m a c j e O P o p r a w c e ();
11 }
12 }

Co to jest liczba?

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 24/ 31
Refaktoryzacja 8 — Zmiana nazwy zmiennej liczba

1 public static void


2 W y s w i e t l I n f o r m a c j e O B l e d z i e ( int nrBledu ) {
3 System . out . print ( nrBledu );
4 System . out . println ( " ) bledzik " );
5 }
6 public static void W y s w i e t l I n f o r m a c j e O P o p r a w c e () {
7 System . out . println ( " ... poprawiony " ); }
8
9 public static void main ( String [] args ) {
10 int nrBledu =0;
11 W y s w i e t l I n f o r m a c j e O B l e d z i e ( nrBledu );
12 W y s w i e t l I n f o r m a c j e O P o p r a w c e ();
13 }

Dla porównania — na następnej stronie kod, od którego zaczę-


liśmy
Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 25/ 31
Co za ochydztwo!
1 static int x ;
2 public static void f (){
3 if (++ x ==1) {
4 System . out . println ( " ) bledzik " );
5 } else {
6 System . out . println ( " ... poprawiony " );
7 }
8 }
9 public static void f ( int x ){
10 f (); System . out . print ( x );
11 }
12 public static void main ( String [] args ) {
13 int x =0; f ( x ); f ();
14 }

A teraz co?
Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 26/ 31
Tworzenie obiektów
1 public class Test {
2 private int x ;
3 public void SetX ( int newX ) {
4 x = newX ;
5 }
6 public int GetX () {
7 return x ;
8 }
9 }
10 public class Main {
11 public static void main ( String [] args ) {
12 Test obj = new Test ();
13 obj . SetX (2);
14 System . out . println ( obj . GetX ());
15 }
16 }
Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 27/ 31
Obiekt

Definition
Obiekt jest to struktura zawierająca dane wewnętrzne i
definiująca sensowne operacje na tych danych i/lub na danych
dostarczonych z zewnątrz, przy czym dane wewnętrzne są
chronione przed niepowołanym dostępem z zewnątrz.
Wszystkie dane wewnętrzne obiektu muszą mieć nadane
sensowne wartości początkowe w momencie tworzenia obiektu.
Nie może istnieć obiekt, którego chociaż jedna składowa nie
została ustawiona na sensowną wartość podczas jego
tworzenia!

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 28/ 31
Tworzenie obiektów
1 public class Test {
2 private int x ;
3 public Test ( int newX ) {
4 SetX ( newX );
5 }
6 public void SetX ( int newX ) {
7 x = newX ; }
8 public int GetX () {
9 return x ; }
10 }
11 public class Main {
12 public static void main ( String [] args ) {
13 Test obj = new Test (2);
14 obj . SetX (2); /* NIEPOTRZEBNE ! */
15 System . out . println ( obj . GetX ());
16 }
17 }
Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 29/ 31
Zgłaszanie błędów — wyjątki
1 public static void main ( String [] args ) {
2 BufferedReader stdin = new BufferedReader (
3 new I nputSt reamRe ader ( System . in ) , 1
4 );
5 String str ;
6 int liczba ;
7 try {
8 System . out . println ( " Podaj tekst " );
9 str = stdin . readLine ();
10 liczba = Integer . parseInt ( str );
11 System . out . println ( str );
12 }
13 catch ( Exception e ) {
14 }
15 }

Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 30/ 31
Zgłaszanie błędów — wyjątki
1 try {
2 System . out . println ( " Podaj tekst " );
3 str = stdin . readLine ();
4 liczba = Integer . parseInt ( str );
5 System . out . println ( str );
6 }
7 catch ( N u m b e r F o r m a t E x c e p t i o n e ) {
8 System . err . print ( " Blad konwersji typu " );
9 System . err . print ( e . getClass ());
10 System . err . print ( " : " );
11 System . err . print ( e . getCause ());
12 System . err . print ( " . " );
13 System . err . println ( e . getMessage ());
14 }
15 catch ( IOException e ) { [...]
16 }
17 }
Łukasz Hładowski
Podstawy modelowania programów — Wykład 1 31/ 31

You might also like