Садржај
2 Класе и објекти
2.1 Основни појмови о класама и објектима
3 Генеричке класе
4 Наслеђивање и полиморфизам
5 Примери пројеката са решењима
5.1 Различита кретања
5.2 Квиз
5.4 Приказ рада алгоритама сортирања

Повезане класе

У овој лекцији:

  • библиотека која се састоји од више класа,

  • апликација која користи више библиотека,

  • повезаност класа, распоређивање класа у модуле,

  • зависност и спрегнутост модула.

Класе у објектно оријентисаном програмирању су природне целине, које већ групишу одређену функционалност и издвајају је од осталог кода. У том смислу, довољно богата класа може да се прогласи за самосталан модул и да се смести у библиотеку, као што смо то учинили са класом Asocijacije у претходној лекцији. Ипак, релативно је ретко да једна изолована класа сама за себе пружа довољно функционалности да би била проглашена модулом. Обично је за пружање заокружене услуге потребно неколико класа које међусобно тесно сарађују. Класе које чине такву групу, треба да заједно представљају један модул, односно да се сместе у заједничку библиотеку, јер се свакако увек користе заједно. Овде ћемо да представимо један такав пример.

Пример – аналитичка геометрија

У задацима из аналитичке геометрије често је потребно да се одреде координате пресека две праве, пресека круга и праве, координате средишта дужи, једначина симетрале дужи, једначина праве нормалне на дату праву која садржи дату тачку итд.

У таквим задацима су очигледно важни појмови тачке и праве, па је корисно да их представимо класама Tacka, односно Prava. За тачку је јасно да ћемо је задавати паром реалних координата, али о могућим начинима задавања праве треба размислити. Неки од начина на које права може да се представи су:

  • помоћу линеарног и слободног коефицијента из експлицитне једначине, \(y=kx+n\),

  • општом једначином, \(ax+by=c\),

  • помоћу две тачке, \(A(x_0, y_0), B(x_1, y_1)\),

  • параметарским једначинама, \(x=at+x_0, y=bt+y_0\),

  • помоћу једне тачке \(A(x_0, y_0)\) и вектора правца \(\overrightarrow{p}=(a, b)\).

Облик са линеарним и слободним коефицијентом није згодан, јер њиме не можемо да представимо усправне праве. Облици са две тачке, параметарским једначинама и помоћу вектора и тачке су међусобно веома блиски и лако се своде један на други (пробајте да се самостално уверите у ово). Према томе, сваки од ових начина представљања праве би могао добро да послужи. Размислимо сада мало и о могућим поступцима које ћемо кроз употребу овог модула да исказујемо и спроводимо. То треба да буду поступци чијим комбиновањем можемо да решавамо сложеније задатке. Ево неких примера таквих поступака.

  • Одреди правац праве, нормалне на дату праву \(p\).

  • Одреди тачку која припада датој правој \(p\), на растојању \(d\) од дате тачке \(P\) те праве.

  • Одреди праву паралелну датој правој \(p\), која садржи дату тачку \(Q\).

Правац се природно исказује вектором. Друга тачка на правој се добија транслацијом дате тачке праве за вектор одговарајуће дужине паралелан правој. Уочавамо да је вектор још један врло користан појам за изражавање односа између тачака и правих, као и за израчунавање нових тачака и правих. Зато ћемо и њега да представимо одговарајућом класом Vektor. Користећи векторе, одређивање праве паралелне датој правој која садржи дату тачку постаје сасвим једноставно (нема потребе ни за каквим рачунањем).

Током употребе ових класа (у наставку лекције), постаће још јасније колико су вектори корисни у извођењу геометријских конструкција у рачунарској геометрији.

Очигледно је да ниједна од класа Tacka, Prava и Vektor није нарочито корисна сама за себе (у изолацији), јер свака од њих интензивно користи остале. Зато је природно да све три класе прогласимо за један модул и ставимо у једну библиотеку.

Класе Tacka, Prava и Vektor дефинисане су у именском простору AG, скраћено од аналитичка геометрија. Надаље ћемо име AG да користимо и за модул коме припадају ове класе. Ево како би могао да изгледа фајл ag_lib.cs , који је за сада једини фајл са изворним кодом библиотеке AG.

Сада ову библиотеку можемо једноставно да употребљавамо у различитим пројектима, било да они служе за тестирање библиотеке, решавање математичких задатака, графичко приказивање геометријских конструкција или за било коју другу сврху.

Да бисмо заокружили овај пример и илустровали употребу библиотеке AG, прилажемо неколико малих конзолних апликација које користе пројекат AG, односно зависе од њега (ово треба подесити у окружењу). Свака од ових апликација решава по један математички задатак, у коме је потребно да се нека геометријска конструкција изврши средствима аналитичке геометрије. При томе не долази до понављања заједничког кода, већ је довољно за сваку апликацију подесити зависност од библиотеке. Подсећамо да је подешавање међусобне зависности пројеката објашњено на примеру игре Асоцијације у лекцији Модуларност, библиотеке.

Пример – одредити центар круга описаног око троугла \(ABC\), чија су темена \(A(3, 3), B(10, 10), C(12, 6)\).

Пример – одредити центар круга уписаног у троугао \(ABC\), чија су темена \(A(6, 5), B(3, 2), C(10, 1)\).

Пример – одредити центар круга споља уписаног уз страницу \(AB\) троугла \(ABC\), чија су темена \(A(6, 5), B(3, 2), C(10, 1)\).

Пример – конструисати троугао \(ABC\), ако је дато \(A(3, 2)\), \(B(9, 2)\), \(\alpha = 30 ^{\circ}\), \(\beta = 60 ^{\circ}\).

Пример – конструисати троугао \(ABC\), ако је дато \(B(21, 9)\), \(C(15, 15)\), \(\beta = 45 ^{\circ}\), \(b+c = 24\).

Даљим развојем модула AG могло би да се очекује да постојећој групи класа додамо још неке, а да постојеће класе добију нове методе. На пример, могли бисмо да додамо класу Krug, која би омогућила једнако удобно решавање шире класе задатака. Са друге стране, на пример, класи Prava можемо да додамо метод ToString за исписивање једначине праве, метод Parse за инстанцирање праве на основу њене једначине записане у неком стандардном облику (дате као стринг), метод за пресек са кругом (који би могао да враћа пар референци на тачке, с тим да референце буду празне ако не постоји пресек) итд.

Уколико кôд модула AG постане велики и непрегледан, дати фајл може да се подели на неколико фајлова, од којих би сваки садржао по једну класу. Садржај свих тако насталих фајлова би и даље припадао истом именском простору, тј. сваки фајл модула AG би био облика

namespace AG
{
    ...
}

Са друге стране, сваки кôд који користи овај модул налазио би се у неком другом именском простору и неком другом модулу. Зато је потребно да се на почетку сваког фајла у коме се користи именски простор AG наведе using AG;.

Одлука о томе када неки фајл постаје превелики и треба да се подели на мање фајлове је ствар процене и договора тима. Уобичајена величина фајла (чак и у веома великим пројектима) је од стотинак, до неколико стотина линија кода. Ове границе треба схватити условно, јер се дешава да неки фајлови прерасту и више хиљада линија. Договор тима може, на пример, да буде да се за фајл који достигне две хиљаде линија размисли о реорганизацији тог кода у више фајлова, а по потреби и у више класа.

(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+