# Method

## Model Oluşturma&#x20;

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&#x20;

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ı&#x20;

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&#x20;

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&#x20;

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&#x20;

`CLinkedList` class’ının fonksiyonlarını yazıp arayüzde bunları kullanmaya başladığımızda bazı problemlerle karşılaştık. Bunlar;

{% hint style="success" %}
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.
{% endhint %}

{% hint style="success" %}
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.
{% endhint %}

{% hint style="success" %}
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.
{% endhint %}

## Arayüzü Dinamik Hale Getirme&#x20;

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&#x20;

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&#x20;

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ı&#x20;

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.&#x20;

## Design Patterns&#x20;

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:&#x20;

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:&#x20;

Ç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:&#x20;

Formları bağlarken tight coupling değil de loose coupling ile bağlama esnekliğini sağladık.

### 4- Fluent API:&#x20;

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:&#x20;

Veri depolama alanlarını nesneye dönüştürerek manipüle etmemizi sağlayan bir prensiptir.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://busco.xdebuggers.com/method.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
