Method

These are the phases in which we developed the system.

Model Olu┼čturma

Projemize ilk olarak istenen ├Âzellikleri okuyarak ba┼člad─▒k. Ard─▒ndan sisteme laz─▒m olan bile┼čenleri belirleyip model haline getirdik. Her modelin ├Âzelliklerini d├╝┼č├╝nerek alanlar─▒n─▒ ve tiplerini belirledik.

Aray├╝z ve Algoritma Tasla─č─▒ Haz─▒rlama

Projenin isterlerini okuduktan sonra nas─▒l bir aray├╝ze sahip olmas─▒ gerekti─čine karar verdik. ─░lk ├Ânce admin olarak sisteme giri┼č yapan ki┼činin kar┼č─▒s─▒na ├ž─▒kacak ekran─▒n tasla─č─▒n─▒ ├žizdik ve i├žerisinde yap─▒lan sefer i┼člemlerinin listesini olu┼čturduk. Daha sonra kullan─▒c─▒ aray├╝z├╝n├╝n tasla─č─▒n─▒ olu┼čturmaya ba┼člad─▒k. Bu b├Âl├╝mde biletin sat─▒n alma algoritmas─▒n─▒ ├ž─▒kard─▒k. Program─▒n ak─▒┼č diyagram─▒n─▒ olu┼čturduk.

Yaz─▒l─▒m Mimarisi Belirlenmesi

Yapt─▒─č─▒m─▒z ara┼čt─▒rmalar, haz─▒rlad─▒─č─▒m─▒z algoritmalar ve taslaklardan yola ├ž─▒karak geli┼čtirece─čimiz sistemin mimari tasar─▒m─▒n─▒ belirledik. Bu mimari tasar─▒m iki k─▒s─▒mdan olu┼čmaktad─▒r. Bunlardan birincisi class k├╝t├╝phanesidir. TASLibrary (Ticket Automation System Library) k├╝t├╝phanesi LinkedList yap─▒s─▒, Model ve DataAccess classlar─▒ndan olu┼čmaktad─▒r. ─░kincisi ise TASUI (Ticket Automation System User Interface) WPF uygulamas─▒ndan olu┼čur. Aray├╝z kodlar─▒ burada bulunmaktad─▒r.

Linkedlist Ara┼čt─▒rmas─▒

Daha ├Ânceden linkedlist yap─▒s─▒n─▒ biliyorduk ve h─▒z a├ž─▒s─▒ndan daha verimli olaca─č─▒n─▒ d├╝┼č├╝nd├╝─č├╝m├╝z i├žin projemizi single linked list de─čil double linked list ┼čeklinde olu┼čturmaya karar verdik. Bu listeyi uygulamam─▒zda herhangi bir veri tipiyle kullanabilmek i├žin ÔÇťGeneric ClassÔÇŁ olarak yazd─▒k. CLinkedList classÔÇÖ─▒n─▒ add() fonksiyonu ile prototip a┼čamas─▒nda kullan─▒labilir hale getirdik.

Prototip Tasarlama

Aray├╝z i┼člemleri a┼čamas─▒nda haz─▒rlad─▒─č─▒m─▒z taslaklar─▒ WPF frameworkÔÇÖ├╝n├╝ kullanarak kodlad─▒k. CLinkedList classÔÇÖ─▒ndaki add() fonksiyonunu kullanarak haz─▒rlad─▒─č─▒m─▒z aray├╝z├╝ dinamik hale getirdik.

Linkedlist ClassÔÇÖ─▒n─▒ Yazma

Yazaca─č─▒m─▒z CLinkedList classÔÇÖ─▒n─▒n her yaz─▒l─▒mc─▒ taraf─▒ndan kullan─▒labilir olmas─▒ i├žin MicrosoftÔÇÖun .netÔÇÖdeki ÔÇťLinkedListÔÇŁ ve ÔÇťListÔÇŁ classÔÇÖlar─▒n─▒n dok├╝mantasyonuna bakarak kendi classÔÇÖ─▒m─▒z─▒ yazmaya ba┼člad─▒k. Bu listenin nodu olarak CNode classÔÇÖ─▒n─▒ olu┼čturduk. Ard─▒ndan listedeki nodeÔÇÖlar─▒ manip├╝le eden fonksiyonlar─▒ yazd─▒k. Bu fonksiyonlardan baz─▒lar─▒na ├Ârnek verecek olursak bunlar; AddLast(), RemoveLast(), Find() vb.

Proje Sorun ve ├ç├Âz├╝mleri

CLinkedList classÔÇÖ─▒n─▒n fonksiyonlar─▒n─▒ yaz─▒p aray├╝zde bunlar─▒ kullanmaya ba┼člad─▒─č─▒m─▒zda baz─▒ problemlerle kar┼č─▒la┼čt─▒k. Bunlar;

WPF baz─▒ elementlerinin ItemSource ├Âzelli─čine atanan de─či┼čken tipinin IEnumerable interfaceÔÇÖinin implemente olmas─▒ gerekti─či i├žin classÔÇÖ─▒m─▒za GetEnumerator() fonksiyonunu yazarak implement ettik.

Aray├╝z ├╝zerinde listede bir de─či┼čiklik oldu─čunda aray├╝z ├╝zerinde g├Âr├╝nm├╝yordu. Bu sorunu gidermek i├žin classÔÇÖ─▒m─▒za INotifyCollectionChanged interfaceÔÇÖini NotifyCollectionChangedEventHandler eventini kullanarak implemente ettik.

CNode class─▒ generic oldu─ču i├žin kar┼č─▒la┼čt─▒rma i┼člemlerini IEquatable interfaceÔÇÖi b├╝t├╝n model classÔÇÖlar─▒na implemente ederek ger├žekle┼čtirdik.

Aray├╝z├╝ Dinamik Hale Getirme

Prototip a┼čamas─▒nda haz─▒rlad─▒─č─▒m─▒z aray├╝z tasar─▒m─▒n─▒ WPF ve MaterialDesignXAML frameworkÔÇÖ├╝n├╝ kullanarak sefer ekleme, seferleri listeleme ve bilet sat─▒n alma sayfalar─▒n─▒ kodlad─▒k. Daha sonra CLinkedList classÔÇÖ─▒ndaki fonksiyonlar─▒ kullanarak aray├╝z├╝ dinamik hale getirdik. Hem formlar aras─▒nda veri transferi yapabilmek i├žin hem de formlar─▒ birbirine ba─čl─▒ kalmamas─▒ i├žin loose coupling design patternÔÇÖini kullanarak formlar─▒ ba─člad─▒k. Bilet alma i┼čleminde otob├╝s├╝n koltuk say─▒s─▒ kadar alan eklemek i├žin SeatUserControl kullanarak dinamik bir ┼čekilde aray├╝zde koltuk eklenebilir hale getirdik.

Dosya Yazma ve Okuma

Verilerimizin kaydedilmesi projemizin en ├Ânemli noktalar─▒ndan biriydi. Bizde bu i┼čin nas─▒l yap─▒lmas─▒ gerekti─čini ara┼čt─▒rmaya ba┼člad─▒k. ─░lk ba┼čta verileri dosyaya yazma formatlar─▒ndan (Binary, XML, SOAP, CSV) Binary format─▒n─▒ h─▒zl─▒ ve g├╝venli oldu─ču i├žin kullanmaya karar verdik. Aray├╝zde yapt─▒─č─▒m─▒z de─či┼čiklikleri Binary format─▒nda dosyaya yazmaya ba┼člad─▒k. Daha sonra CLinkedList ve Modellere Serializable ├Âzelli─či eklenmeden Binary SerializerÔÇÖ─▒n ├žal─▒┼čmad─▒─č─▒n─▒ fark ederek ekledik. C# kendi kendine classÔÇÖlar─▒ Serialize edebiliyor ancak biz belirli bir formatta Serialize etmesini istedi─čimiz i├žin ISerializable interfaceÔÇÖini implemente ettik. Bu interface ile dosyaya belirlenen modeldeki alanlar─▒ yazma i┼člemini ve dosyadan okuma i┼člemini ger├žekle┼čtirdik.

Projemizde veri depolama ┼čeklinin esnek olmas─▒ i├žin IDataConnection ad─▒nda bir interface olu┼čturduk. Bu interfaceÔÇÖi implement ederek ister text dosyas─▒ isterse veri taban─▒ ┼čeklinde bu interfaceÔÇÖi aray├╝zde kullanan kodlar─▒ de─či┼čtirmeden yeni bir depolama tipine ge├ži┼č yap─▒labilir hale getirdik. Ard─▒ndan TextFileConnector classÔÇÖ─▒na IDataConnectionÔÇÖ─▒ implement ederek gerekli fonksiyonlar─▒ yazd─▒k.

Proje isteklerinde sefer bilgilerinin dosyada okunabilir ┼čekilde tutulmas─▒ istendi─či i├žin b├╝t├╝n olu┼čturdu─čumuz data structure classÔÇÖlar─▒m─▒zda ToString() fonksiyonunu override ederek text dosyas─▒nda UTF-8 format─▒nda yazd─▒k.

Sefer Numaras─▒ ve Toplam Sefer Say─▒s─▒ ─░┼člemleri

Proje isteklerine g├Âre seferlerin farkl─▒ dosyalarda tutulaca─č─▒ i├žin en son eklenen seferin numaras─▒n─▒ takip etmek zaman kayb─▒ oluyordu. Bu sorunu ortadan kald─▒rmak i├žin dbinfo.info ad─▒nda dosya olu┼čturarak en son eklenen seferin numaras─▒n─▒ burda saklad─▒k. Her sefer eklendi─činde ayn─▒ dosya ├╝zerinde sefer numaras─▒n─▒ artt─▒r─▒yoruz.

Proje isteklerinden di─čer biride toplam sefer say─▒s─▒n─▒ g├Âstermek oldu─ču i├žin dbinfo.info dosyas─▒nda bu bilgiyi saklamaya ba┼člad─▒k. Sefer eklendi─činde bu bilgiyi artt─▒r─▒yoruz sefer silindi─činde ise azaltarak g├╝ncelliyoruz.

Log Kayd─▒

Veri taban─▒ i┼člemlerinde yap─▒lan i┼člemlerin ge├žmi┼činin tutulmas─▒ b├╝y├╝k ├Ânem arz etti─či i├žin Logger classÔÇÖ─▒ olu┼čturduk. Yap─▒lan de─či┼čiklikler her g├╝n i├žin ayr─▒ bir log dosyas─▒nda saklanmaktad─▒r. Log dosyas─▒n─▒n i├žinde sefer ekleme, silme, g├╝ncelleme bilgilerinin yan─▒ s─▒ra bilet sat─▒n alma i┼člemleri tutulmaktad─▒r.

Design Patterns

Hem kendimizi design pattern konusunda geli┼čtirmek hem de projenin belli stantardlar ├╝zerinde geli┼čtirilmesi i├žin birka├ž tane design patternÔÇÖi kodlar─▒m─▒zda kulland─▒k. Bunlar;

1- SOLID:

Yaz─▒l─▒m─▒n esnek, yeniden kullan─▒labilir, s├╝rd├╝r├╝lebilir ve anla┼č─▒l─▒r olmas─▒n─▒ sa─člayan ve kod tekrar─▒n─▒ ├Ânleyen yaz─▒l─▒m prensibidir. Single-responsibility principle DataAccess classÔÇÖ─▒nda kulland─▒k.

2- Builder:

├çok alanl─▒ classÔÇÖlar─▒n objelerini constructor kullanmadan olu┼čturabilmek i├žin kullan─▒lan bir prensiptir. FileDbInfo classÔÇÖ─▒ i├žin kulland─▒k.

3- Loose Coupling:

Formlar─▒ ba─člarken tight coupling de─čil de loose coupling ile ba─člama esnekli─čini sa─člad─▒k.

4- Fluent API:

Ak─▒c─▒ bir aray├╝z, tasar─▒m─▒ b├╝y├╝k ├Âl├ž├╝de y├Ântem zincirlemeye dayanan bir nesne y├Ânelimli API'dir. Amac─▒, alana ├Âzg├╝ bir dil olu┼čturarak kod okunabilirli─čini art─▒rmakt─▒r. Bu y├Ântemi FileDbInfoBuilder classÔÇÖ─▒nda kulland─▒k.

5- Model:

Veri depolama alanlar─▒n─▒ nesneye d├Ân├╝┼čt├╝rerek manip├╝le etmemizi sa─člayan bir prensiptir.

Last updated