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