March 06, 2018

Selamün Aleyküm;

Ben Android'de veritabanını örnek vererek sorumu soracağım. Malum olarak Android'de veritabanı için SQLite şu şekilde kodlanıyor (Java kodu):

Veritabanı için yardımcı bir sınıf hazırlıyoruz:

// DbHelper sınıfı
public class DbHelper extends SQLiteOpenHelper
{
 public DbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
 {
   super(context, name, factory, version);
 }

 @Override
 public void onCreate(SQLiteDatabase sqLiteDatabase)
 {
   sqLiteDatabase.execSQL("CREATE TABLE Kisiler(id INTEGER PRIMARY KEY," +
       "Adi TEXT, Soyadi TEXT, Telefonu TEXT);");
 }

 @Override
 public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1)
 {
   sqLiteDatabase.execSQL("DROP TABLE IF EXISTS Kisiler");
   this.onCreate(sqLiteDatabase);
 }
}

Android'de veritabanına veri ekleme, silme, güncelleme vs. işler için şöyle bir yol izleniyor:

DbHelper dbHelper = new DbHelper(this, "veriler.db", null, 1);
SQLiteDatabase db = dbHelper.getWritableDatabase();

// Veri eklemek için:
void insertToDb(SQLiteDatabase db, int id, String name, String surname, String phone)
{
   ContentValues values = new ContentValues();
   values.put("id", id);
   values.put("Adi", name);
   values.put("Soyadi", surname);
   values.put("Telefonu", phone);
   db.insert("Kisiler", null, values);
}

// Veri güncellemek için:
void update(ContentValues values)
{
 int res = db.update("Kisiler", values, "Adi = ?", new String[] { "Ali" });
 System.out.println(((res > 0) ? "Güncelleme Başarılı!" : "Başarısız!"));
}

void delete(String name)
{
 int res = db.delete("Kisiler", "Adi = ?", new String[] { name });
}

String getNames()
{
 Cursor cursor = db.rawQuery("SELECT Adi FROM Kisiler", null);
 String names = "";
 while (cursor.moveToNext()) {
   names += cursor.getString(0) + "\n";
 }
 return names;
}

Bu şekilde kodlarımı yazıyorum lakin tasarım aşamasında bu kodları nasıl tasarlamalıyım? Yani bu ekle, sil, güncelle ve verileri alma ile ilgili metotları DbHelper sınıfına mı yazmalıyım yoksa yeni bir sınıf açıp, bu sınıfı DbHelper'dan türetip bu sınıfa mı eklemeliyim? Veritabanı için kod tasarımını nasıl yapmalıyım?
Bir yerde birisi bunun için Repository, Dependency Injection, Special Case, Domain Model, Singleton ve Factory Method tasarım kalıplarını kullanmış fakat bu bana biraz saçma geldi, nedeniyse IRepository, XXXEntitity vs. gibi birçok farklı sınıf / arayüz oluşturulmuş ve kod satırlarca uzatılmış. Hem kod okunaklılığı azalmış hem de kodun yeniden geliştirilebilme olanağı azalmış. Karışık ve sürekli birbirine bağlanan bu kadar sınıf / arayüz neden yazılır anlamış değilim, önemli olan kodun okunaklılığı ve geliştirilebilirliği ise neden bu kadar uzatma gereği duyalım ki? Basit / orta / büyük çaplı SQLite veritabanı işlemleri için kod tasarımı nasıl olmalı?
Teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 06, 2018

Asıl sorunun yanıtını bilmiyorum ama basitlik konusunda çok haklısın. Ancak, her durumda olmasa da bahsettiğin sınıfların hepsinin de bir yararı var. Örneğin, basit kodlanmış bir programda bir değişiklik gerektiğinde çok sayıda kaynak dosyada değişiklik yapmak gerekebilir.

Benim önerim, olabildiğince basit yazmaya çalışmalı ama işler düzgün yürümeyince başkalarının başvurdukları çözümlere bakmalı. İnsan deneyimle öğreniyor. :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]