Повезане класе - решен пример¶
У овој лекцији видећемо пример групе од три класе које тесно сарађују међу собом. Ова група класа представља целину, коју можемо да прогласимо за посебан модул. Кôд који би користио ову класу, било у конзолној или графичкој апликацији, представљао би одвојен модул.
Пример - аналитичка геометрија¶
У задацима из аналитичке геометрије често је потребно да се одреде координате пресека две праве, пресека круга и праве, координате средишта дужи, једначина симетрале дужи, једначина праве нормалне на дату праву која садржи дату тачку итд.
У таквим задацима су очигледно важни појмови тачке и праве, па је корисно да их представимо класама
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
дефинисане су у именском простору AG
, скраћено од
аналитичка геометрија. Надаље ћемо име AG
да користимо и за модул коме припадају ове класе.
Фајл ag_lib.cs
који смо управо видели, може да се смести у засебну (динамичку) библиотеку,
чиме омогућавамо једноставну употребу модула AG
у различитим пројектима, било да они служе за
тестирање написаног кода, решавање математичких задатака, или за приказивање геометријских слика.
Да бисмо довршили пример и илустровали употребу модула AG
, искористићемо тај модул за решавање
неколико задатака из аналитичке геометрије. Ради тога можемо да напишемо једну конзолну апликацију
као засебан модул и подесиомо је да зависи од пројекта AG
(видети претходни пример).
Даљим развојем модула AG
би могло да се очекује да постојећој групи класа додамо још неке, а
да постојеће класе добију нове методе. На пример, могли бисмо да додамо класу Krug
, која би
омогућила једнако удобно решавање шире класе задатака. Са друге стране, на пример, класи Prava
можемо да додамо метод ToString
за исписивање једначине праве, метод Parse
за инстанцирање
праве на основу њене једначине записане у неком стандардном облику (дате као стринг), метод за
пресек са кругом (који би могао да враћа пар референци на тачке, с тим да референце буду празне
ако не постоји пресек) итд.
Уколико кôд модула AG
постане велики и непрегледан, дати фајл може да се подели на неколико
фајлова, од којих би сваки садржао по једну класу. Садржај свих тако насталих фајлова би и даље
припадао истом именском простору, тј. сваки фајл модула AG
би био облика
namespace AG
{
...
}
Са друге стране, сваки кôд који користи овај модул налазио би се у неком другом именском простору
и неком другом модулу. Зато је потребно да се на почетку сваког фајла у коме се користи именски
простор AG
наведе using AG;
.
Одлука о томе када неки фајл постаје превелики и треба да се подели на мање фајлове је ствар процене и договора тима. Уобичајена величина фајла (чак и у веома великим пројектима) је од стотинак, до пар хиљада линија кода.