ile

Hiç Bilmeyenler İçin Nesne Yönelimli Programlamaya Giriş-7 —Sınıfları Kullanmak ve API meselesi

Bu yazı daha önce yazdığım Hiç Bilmeyenler İçin Nesne Yönelimli Programlamaya Giriş-6 yazısının devamıdır. Önce onu okumanızı öneririm.

Medium.com adresinde görüntüleyin

Bu yazıya kadar, bir programı sınıflar kullanarak nasıl tasarlayacağımızı, nasıl temiz kod yazacağımızı, kodlarımızı nasıl hatalara karşı kontrol edeceğimizi, sınıflarımızın sorumluluklarının ne olacağını anlattık. Peki programımızı kim nasıl kullanacak? Sınıflarımızı yazdık ve app.php dosyası içinde de kullandık, ama son kullanıcı bu programı nasıl kullanacak? Bu yazıda bu konuyu detaylıca işleyeceğiz. Ayrıca programımıza arama, sıralama, üyelik gibi ek özellikler eklemek istediğimizde ne yapacağız? Bu meseleye de bu yazıda kısaca değineceğiz.

Kullanıcılar

Genel olarak programların amacı

Bu konuyu bu seride defalarca açıklamıştık ancak şimdi tıpkı başta sınıflarımızı tasarladığımızda yaptığımız gibi, programımızın nasıl çalışacağını ve amaçlarının ne olduğunu kısaca anlamamız gerekiyor ki, sınıflarımızı kullanacak program kodumuzu da nesne yönelimli bir şekilde tasarlayabilelim.

  1. Genellikle programların amacı kullanıcıdan istekleri ve girdiyi almak, bunu hatalı girdilere karşı doğruladıktan ve güvenlik açıklarına karşı temizledikten sonra işlemektir. Bu web uygulamalarında html dosyaları içindeki web formları aracılığı ile yapılır.
  2. Kullanıcı girdileri genellikle bir dosyaya veya veri tabanına kaydedilir. Verilere ne şekilde kaydedildiği genellikle programın mantığını tutan sınıfın sorumluluğunda değildir. (MVC konusunda bu kavramı detaylıca açıklayacağım.)
  3. Kullanıcı daha önce eklediği verilere erişmek ve görüntülemek isteyecektir. Yani program veri tabanından veriyi alıp, kullanıcıya, onun anlayabileceği şekilde göstermek zorundadır.

Daha önce nesneleri tasarlamayı anlatırken, nesnelerin bağımsız programlar gibi canlı ve kendi kendine yeten varlıklar olmaları gerektiğinden bahsetmiştik. Yani hiçbir nesne, mantıken başka bir nesneye göbekten bağlı, olmayacak. Bir diğer kural da bir nesne içinde başka bir nesneyi new ifadesi ile yaratmamak. Böyle bir kod bloku yazıyorsak, sınıfımızın diğer nesneye göbekten bağımlıdır ve o nesnede yapılacak herhangi bir değişiklik nesnemizin davranışını ve ondan beklentilerimizi bozacaktır. Daha iyi anlamak için şöyle bir örnek vereyim: Mesela bu yazıya eklediğim linkler üzerinde hiçbir kontrolüm yok. Eğer linkte bulunan yazı silinirse veya değişip saçma sapan bir siteye giderse, yazımda saçma sapan bir bilgiye yer vermiş olacağım. Bu konuya bağımlılık enjeksiyonu ve bağımlılık çevrimi (dependency injection ve dependency inversion) deniyor. Kabul, Türkçe’ye çevirince çok abuk oldu ama konuyu detaylıca anlattığımda buna da doğru dürüst bi karşılık bulmaya çalışırız. Solid ilkeleri ile ilgili bir kaynak: http://tarikkaygusuz.com/post/solid-prensipleri

Programdan beklentilerimiz ve arayüzler

Bu seride, sınıf ve program kavramlarını birbirinden ayrı düşünmemeye özen gösterdik. Bir sınıfı yazarken, yapabileceği işleri interface yani arayüzde tanımlamıştık. Daha sonra o sınıfı kullanan herhangi bir kod, sınıfın o arayüzde tanımlandığını bildiğinden erişebileceği ve kullanacağı public metotların neler olduğunu biliyordu. Herhangi bir programı web arayüzünden veya komut satırından kullandığımızda da aynı beklenti kalıplarına sahibiz. Örneğin, bir web uygulamasını veya sitesini açtığımızda, sol tarafta üstüste bir sürü link ile yapabileceğimiz işleri görebiliriz.


Kullanıcıların aşina oldukları arayüzleri programlarımızda kullanırsak, hem kolay kullanım hem de anlaşılabilirlik sağlamış oluruz.

Eğer Unix/Linux/MacOs/BSD terminaline, kabuğuna, komut satırına, ya da adı her ne boksa veya windows’taki cmd yazınca çıkan dos ortamına, powershell’e fln alışkınsanız, komut satırında herhangi bir komut ardından -h veya — help yazdığınızda, o programına hangi parametreleri girerek işlem yapacağınızı gösteren bir yardım listesiyle karşılaşacağınızı bilirsiniz.

Windows ortamında, cmd.exe’yi çalıştırıp dir /? yazarsanız, içinde bulunduğunuz dizindeki dosyaları gösteren dir komutunun yardım dokümanını görürsünüz.

Dos ortamında Dır komutunun yardımı

Unix ortamında çalışıyorsanız, herhangi bir komutun sonuna -h veya — help yazdığınızda aynı help dokümanıyla karşılaşmayı beklersiniz. Komutu yazan programcı, gıcık veya şerefsiz değilse genelde kullanıcının bu beklentisini tatmin etmeye çalışır.

Unix ortamında composer komutunun yardımı

İlk adım olarak bu “-h” ya da “ — help” parametresini bildiğinizde, kullanacağınız program hakkında hiçbir bilginiz olmasa dahi, programı nasıl kullanacağınızı size anlatacak bilgilere bu parametreyi kullanarak erişebilirsiniz.

Yenilikçi arayüzler

Yani bilgisayar programlarını yazarken kullanıcıların belirli davranış kalıplarına ve beklentilerine uyarsanız, kötü tasarımınız için küfür yemezsiniz. Tıpkı daha önce verdiğim araba arayüzü örneğinde olduğu gibi, vitesi tavana, direksiyonu vitesin olduğu yere, gaz pedallarını da direksiyonun üzerine koyabilirsiniz ama tabii ki koymamalısınız. Not: Bazı zamanlarda, aşırı yenilikçi kullanıcı arayüzleri yazmanız gerekebilir. Örneğin bir siteye girip uçak bileti almak yerine chat yapan yapay zeka bot programları ile konuşarak uçak bileti alabilirsiniz.

Chatbot arayüzü

Bu tarz yenilikçi arayüzler, yeni yeni kullanılmaya başlansalar da, bunlar için de ortak bir standart zamanla oturacaktır. En basitinden, herhangi bir chatbot’a merhaba dediğinizde merhaba demesini beklersiniz ki bu da bir arayüzdür ve beklentilerimizi tanımlar.

Yönlendirme — Routing

Şimdi genel olarak bir web uygulamasından beklentilerimiz meselesine dönelim. Şimdilik kullanıcı oturum açması parola girmesi kısmını geçeceğim. O konuyu kullanıcı yönetimi konusuna geldiğimizde detaylı olarak açıklayacağım. Bir web uygulamasını açmak için ilk olarak web tarayıcısına adres gireriz, ve genellikle uygulama neyi kaydediyorsa, ilk ekranında onların sıralı listesi gelir. Örneğin YouTube sitesini açtığımızda karşımıza sıralı, ya da belli başlı kategorilere ayrılmış videoların listesini görmek isteriz.

Youtube Anasayfa

Daha sonra mesela eğer video yüklemek istersek, video upload linkine tıklarız. Youtube örneğinde abuk subuk bir ikon kullanmışlar. Çok önemli ve dikkat etmemiz gereken ikinci beklentimiz de şu: Upload yani Video yükleme linkine tıkladığımız zaman, adres çubuğundaki adresin değişmesi. Görelim:

Video Yükleme

Gördüğümüz gibi adres https://youtube.com/upload olarak değişti.

Örneğin haber sitelerinde ya da wordpress bloglarında okunaklı adresler kullanıldığını görmüşsünüzdür. http://www.diken.com.tr sitesinde bir habere tıkladığımızda, tarayıcı şöyle bir adrese gider: http://www.diken.com.tr/galatasaray-hakem-hatalariyla-basladi-pazartesi-derbisiyle-bitirdi-ayricalik-degil-tarafsizlik-istiyoruz/


Ya da örnek bir uygulamada, kullanıcı uygulamayı açtığında doğrudan kaydedilen şeylerin listesini şu şekilde görebilir:

Ana Sayfa

Ya da örneğin Kullanıcı, uygulamada ayarları değiştirmek istiyorsa, settings yani ayarlar linkine tıklar ve karşısına şöyle bir görüntü gelir:

Ayarlar Sayfası

Kullanıcı ayarlar sayfasını açtığında karşısına hazırda ayarları görebileceği bir liste ve o ayarları değiştirebileceği bir form çıkmasını bekler.

Belirli adresleri girerek programda belirli bölümlerin çalışmasını sağlama işlemine, yönlendirme yani routing deniyor.

Uygulama Programlama Arayüzü — API

https://www.smartfile.com/infographic/api/

Diyelim ki sözlük uygulamamızın internet adresi, http://dictionary.mynameismidori.com olsun. Örneğin yygulamadaki varolan sözlükleri listelemek istersek, http://dictionary.mynameismidori.com/dictionaries adresine gireceğimizi biliriz. Kısaca bu linkleri inceleyelim

  1. /dictionaries: Sözlükleri listeleyece olan link
  2. /dictionaries/add: Yeni bir sözlük oluşturmamızı sağlayan formu karşımıza çıkarmalı.
  3. /dictionaries/12: 12 nolu id’ye sahip olan sözlüğü getirecek. Not: id dediğimiz numara, her varlık için eşsiz olan ve varlıkları birbirinden ayırmamızı sağlayan değişkendir. Örneğin, biz sözlük girdilerinde, girdi başlıklarını benzersiz olarak tanımladık. Yani ‘nesne’ adında başka bir girdi olmayacak. Bu sayede bir girdiye erişmek için anahtar olarak bu kelimeyi URL yani web adresi içinde kullanabiliriz.
  4. /dictionaries/12/edit: 12 numaralı sözlüğün, örneğin başlığını değiştirmemizi sağlayacak olan formu çıkaran adres.
  5. /dictionaries/12/delete: 12 numaralı sözlüğü silmemizi sağlayacak adres. Dikkat: Bu adrese erişildiğinde kullanıcıya emin misiniz diye bir bildirim yapılmalı ki, yanlışlıkla silme durumu olmasın.
  6. /dictionaries/12/entries: 12 nolu sözlüğe ait bütün başlıkların listesini getirmeli.
  7. /dictionaries/12/entries/add: 12 nolu sözlüğe ait yeni başlık eklememizi sağlayan formu göstermeli.
  8. /dictionaries/12/entries/nesne: İşte burada id, yani benzersiz anahtar olarak başlık kullandığımız için, linkimiz bu şekilde oluyor. Girdideki değerleri gösterecek. Bu sayfaya /dictionaries/12/entries/nesne/values adresiyle de erişebiliriz. Çünkü nesne girdisindeki açıklamaları zaten gösteren sayfa bu sayfa. Not: Peki ya add isminde çakışan bir başlık girilirse? Buna da dikkat etmemiz gerekiyor.
  9. /dictionaries/12/entries/nesne/edit: Nesne başlığına sahip olan girdinin başlığını değiştirmemizi sağlayan formu gösterecek.
  10. /dictionaries/12/entries/nesne/values/add: Nesne başlığına yeni açıklama eklememizi sağlayacak formu göstermeli.
  11. /dictionaries/12/entries/nesne/values/1: Nesne başlığında 1. sıradaki açıklamayı vermeli. Biz burada id, yani anahtar olarak değerin dizideki sırasını kullandık. Fakat doğru bir pratik olarak int yani tamsayı tipinde bir anahtar kullanmalıyız.
  12. /dictionaries/12/entries/nesne/values/1/edit: Nesne başlığında 1. sıradaki açıklamayı değiştiren formu göstermeli.
  13. /dictionaries/12/entries/nesne/values/1/delete: Nesne başlığında 1. sıradaki açıklamayı silecek olan adres.

Dikkat ettiyseniz, adresler belli deseni takip ediyor. Yani kaydettiğimiz varlığın çoğul ismi — anahtar değeri — add,edit,delete komutlarından bir tanesi. Eğer komut yoksa, hazırda kaydedilmiş varlıkları listeliyor veya anahtar varsa o varlığı ve bağlantılı varlıkları gösteriyor. Yani 12 numaralı sözlüğü açtığımızda, aynı zamanda aksini belirtmediysek, sözlükteki girdilerin listesini de görebilmeliyiz. Aslında bu listeleme işlemine de index deniyor. Yani /dictionaries/12/entries/ linki ile /dictionaries/12/entries/index linki aynı yere gidiyor.

İşte programı kullanmak için girdiğimiz bu adreslere programımızın Uygulama Programlama Arayüzü veya API’si deniyor. Daha bilimsel bir tanımlama verecek olursak:

Uygulama Programlama Arayüzü (UPA) [İngilizce: Application Programming Interface — API], işletim sisteminin, bir kütüphanenin veya bir servisin diğer programlara sağladığı fonksiyon ve sınıf kümesidir. Kaynak: http://www.emo.org.tr/ekler/1db5dd8fa2d87e7_ek.pdf

Başka bir kaynak da şurada: http://koddit.com/yazilim/api-nedir-ne-ise-yarar-orneklerle-inceleyelim/

API’lar sayesinde, örneğin, bir kullanıcıya ait twitter akışını, tıpkı o kullanıcının twitter profilini açmış gibi kendi sayfamızda gösterebiliyoruz. Bu konuyu farklı API’ları kullanmak bölümünde detaylıca anlatacağım.

Yani sınıflarımızı kullanacak program kodunu yazarken, ayrı ayrı index.php, add.php, edit.php gibi dosyalar yazıp tarayıcıyı bu sayfalara yönlendirmek yerine, kullanıcının isteklerini alıp yönlendiren bir program koduna ihtiyacımız olacak. Bunu da bir sonraki yazıda yapacağız.

Bir sonraki yazıya şuradan ulaşabilirsiniz:

Medium.com adresinde görüntüleyin


Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/mtkocak.pdf 
Websitem:
http://mynameismidori.com

Yorumla

Yorum