SOLID Prensipleri

Yazar:

SOLID prensibleri yazılım geliştiren hemen hemen herkesin en azından bir defa duymuş olduğu bir kısaltmadır. İnternette araştırıldığı zaman bu SOLID prensipleriyle ilgili binlerce içerik bulmanız mümkün. O sebeple ben bu yazıda detaya girmeden, yüzeysel olarak, ilk defa okuyacak kişinin bile kolaylıkla anlayabileceği tarzda özetler geçeceğim. 



SOLID prensipleriyle amaçlanan şey özetle, kodların yeniden kullanılabilirliliğini sağlamak ve projeye yeni bir özellik eklenecek olması durumunda, proje kodlarının okunurluluğunu koruyacak esnekliği projeye kazandırmaktır.

SOLID kısaltması, 5 temel prensibin baş harflerinden oluşmaktadır.

S – Single-Responsibility Principle (Her sınıf/fonksiyonun bir tek görevi olmalı)
O – Open-Closed Principle (Geliştirmeye açık değiştirmeye kapalılık prensibi)
L – Liskov Substitution Principle (Liskov yerine geçme prensibi)
I – Interface Segregation Principle (Interface ayrımı prensibi)
D - Dependency Inversion Principle (Dependency Injection uygulamak)

Single-Responsibility Prensibi

Bir Sınıfın ya da fonksiyonun, metodun tek bir görevi ve sorumluluğu olmalıdır. Başka sınıfların görevlerini gerçekleştirmemelidir. Fonksiyon bazında bir örnek vermek gerekirse, bir fonksiyon toplama işlemi yapmakla yükümlü ise, bu fonksiyona bölme işlemi yaptırmamak gerek. Daha somut bir örnekle bir fonksiyon bir kullanıcıya ait parola güncelleme işini üstlenmişse eğer, o fonksiyon sadece parola bilgisi güncellemesi gerekiyor, kullanıcıya ait başka verilerin güncellenmesi işlemini üstlenmemeli. Sınıf üzerinden bir örnek verecek olursam. Eğer Kullanıcı adında bir sınıfımız varsa bu sınıf, sadece kullanıcıya ait sorumlulukları üstlenmeli. Mesela kullanıcının adı, soyadı gibi kullanıcıya has değişkenler içermeli ve bu doğrultuda fonksiyonlar içermelidir. Mesela kullanıcı adını güncellemek, bu sınıfa ait bir fonksiyon olacaktır. Kullanıcıya ait adres bilgisini güncellemek gibi bir fonksiyona ihtiyaç duyarsak yada kullanıcının yaşadığı şehir, sokak, mahalle gibi değişkenlere ihtiyaç duyarsak, bu tarz bilgileri ve işlemleri Kullanıcı sınıfı üzerinden yapmak yerine Adres adında yeni bir sınıf oluşturup oradan gerçekleştirmek, tek bir sınıfa çok fazla sorumluluk yüklemeyi azaltacaktır. Bu da sınıfların daha temiz, anlaşılır yapıda olmasını sağlayacaktır.

Open-Closed Prensibi

Bir uygulamanın, objelerin yada entitylerin geliştirilmeye açık ancak değiştirmeye kapalı olduğunu belirtir. Örneğin elimizde televizyon adında bir sınıf yada interface var. Bu sınıfa ait tvAc() adında bir fonksiyonumuz var. Bir gün dedik ki bu televizyonu açıyoruz bir de buna televizyonu kapatma fonksiyonu ekleyelim. Böyle bir durumda tvAc(); fonksiyonunu editlemek zorunda kalıyorsak, Open-Closed prensibine aykırı bir iş yapıyoruz demektir. Kuracağınız yazılım mimarisini öyle bir dizayn etmeliyiz ki,  bir gün televizyonu kapatmak şeklinde bir implementasyona ihtiyaç dıuyarsak, tvAc(); fonksiyonuna hiç dokunmadan, Televizyon adlı sınıfımıza sadece tvKapat(); adında bir fonksiyon ekleyerek projeye televizyonu kapatma fonksiyonunu kolaylıkla implemente edebilmeliyiz.  Konuyu iyi anlattığını düşündüğüm şu yazıyı incelemenizi tavsiye ederim : https://www.gokhan-gokalp.com/open-closed-principle-ocp-acik-kapali-prensibi/  

Liskov Prensibi

Bir  abstract class yada interface içerisinde kullanılan yada tanımlanan fonksiyonlar, alt sınıflar tarafından override edilerek kullanılamıyorsa, Liskov prensibine aykırı bir kod yazmışız demektir. Çok beğendiğim ve her zaman verdiğim klima örneği vardır. Eminim bu örnekten sonra siz de bu prensibin asıl amacını kolaylıkla anlayacaksınız. Diyelim ki elimizde araba diye bir interface var. Bu interface içerisinde bir arabada olması gereken bazı fonksiyonları tanımladım. Mesela bu fonksiyonlardan bir tanesi klimaAc(); fonksiyonu olsun. Ben bu interface'i Ferrari ve Şahin adında 2 tane sınıfa implemente ederek kullanmak istedim diyelim. Ferrari'de klima olduğu için ben bu fonksiyonu Ferrari sınıfımda kolaylıkla implemente edebileceğim fakat Şahin sınıfında klima adında bir fonksiyon olması gerektiği halde, gerçek hayatta Şahin'in kliması olmadığını düşündüğünüz zaman, klimaAc(); fonksiyonu Şahin sınıfı içerisinde ya NULL bir response dönecek yada Exception fırlatan bir fonksiyon olacaktır. Bu da Liskov prensibine aykırı bir davranıştır. 

Interface Segregation Prensibi

Bir interface içerisinde tanımlı olan fonksiyon, implement edilecek class’lardan birinde bile kullanılmıyorsa, o interface sınıfını ikiye böl veya farklı interface yaz. Kısacası, bir class içerisinde hiçbir zaman kullanılmayacak bir interface fonksiyonu yer almamalı. Örneğin Liskov başlığı altında araba - klima örneğini verdim. Eğer klima özelliği her araçta yoksa, LüksAraclar şeklinde yeni bir interface oluşturabiliriz. Tabii ki günümüzde artık bir aracın klimalı olması lüks değil ama ben konuyu daha anlaşılabilir kılmak için böyle bir örnek vermek istedim.

Dependency Inversion Prensibi

Sınıflar arası bağımlılığı en azaltan bir prensiptir. Bu prensibin implementasyonuna ise Dependency Injection denmektedir.  Bu prensip, üst sınıfı doğrudan alt sınıfa bağlamak yerine, üst sınıfa ait nesneyi alt sınıfa enjekte etmeyi tavsiye eder. Bunu yapmak için ise üst sınıfa ait nesne, alt sınıfta parametre olarak kullanılır. Eğer Spring Boot kullanıyorsanız, bunu @Autowired notasyonu ile defalarca farkında olmadan yapmışsınıdır. Notasyon kullanmadan, getter ve setter metodlarla veya doğrudan constructor sınıflar aracılığıyla üst sınıf nesnesini, başka bir sınıfa parametre olarak verebilirsiniz. Aslında @Autowired notasyonu da bunu yapıyor. Böylece üst sınıfa ait implementasyonları istediğimiz sınıfın içerisinde kullanabiliyoruz. Bu prensip, sınıflar arası"decoupling" yapıyor. Bu sayede sınıfları birbirinden soyutlayarak ayrıştırmış oluyoruz. Bu sayede proje büyüdükçe ortaya çıkabilecek kod karmaşasını önleyerek, projeye esneklik kazandırmış oluyoruz. Bu konuyla ilgili internette binlerce içerik ve örnek var. Ufak bir aramayla bir sürü örneğe ulaşabilir ve bu konuyu daha da pekiştirebilirsiniz. Bana göre yazılım geliştirme alanında mutlaka bilinmesi, hakim olunması gereken bir konu.

Yazının devamını oku
Bu yazıda en basit tanımıyla ORM, Spring Data ve JPA kavramlarından bahsettim. Olabildiğince basit, kafa karıştırmayacak şekilde bir içerik olmasına özen gösterdim. Daha fazla bilgi edinmek isteyenler için konu altında gerekli kaynakları ekledim. Konu ile ilgili yorumlarınızı yorum formu üzerinden iletebilirsiniz. Faydalı olması dileğiyle.

ORM - Object Relational Mapping

  • ORM toolları nesne tabanlı programlamada bulunan objeler ile veritabanı sistemimizdeki tablolar arasında köprü görevi kurulmasını sağlar. 
  • ORM bir konsepttir. Yani model ile veritabanı arasında kurulması gereken konseptin adıdır. Bir araç değildir. 
  • Hibernate gibi EclipseLink, OpenJPA, TopLink gibi birçok farklı ORM aracı bulunmaktadır 
  • ORM toollarından önce yazılımcılar, modeldeki tanımlamaları veritabanındaki tablolarla eşleştirecek kodlar yazıyorlardı.

Hibarnate

  • ORM’nin bir aracıdır. ORM konseptini uygulayan bir araçtır.
  • JPA'nın implementasyonudur.

JPA - Java Persistence Api

  • Java’nın persistence (kalıcılaştırma) apisi olarak geçer. Persistence kelimesi ise uygulama tarafında, veritabanındaki tablo yapısına denk gelen bir model oluşturmak ve bu modele gerekli dataları set etmek anlamına gelmektedir. Bu objeye ait datalar JPA tarafından veritabanına kayıt edilmek üzere kullanılmaktadırlar. 
  • JPA aslında Hibernate, EclipseLink, DataNucleus gibi diğer persistence apilerin birleştirilmesiyle oluşmuştur. 
  • JPA bir standarttır. Hibernate, EclipseLink gibi ORM toolları, JPA'nın implementasyonlarıdırlar.
  • JPA sayesinde ORM toolları arasından istediğimiz birini kullanabilmekteyiz.

Konuyla ilgili internetteki kaynaklarda verilmiş şu benzetmeler gayet hoşuma gitti.
JPA is the dance, Hibernate is the dancer.
JPA is the art, Hibernate is the artist."

Spring Data JPA

  • Hibernate gibi JPA Provider’ların üzerine ek bir soyutlama katmanı ekleyerek veritabanın sorguları kolaylaştırılmıştır. 
  • Sprin Data JPA kullanırsak Repository sınıfımız şöyle olacaktır. En üstte Spring Data JPA > Spring Data Commons > JPA Provider 
  • Spring Data Commons, veri kaydetmeye özgü Spring Data projeleriyle paylaşılan altyapıyı sağlar. 
  • JPA Provider, Hiberbate gibi Java Persistence API’leri implement eder. 

JpaRepository, CrudRepository ve PagingeAndSortingRepository


Yazıyla paralel olarak yararlanabileceğiniz kaynaklar :
Yazının devamını oku
Daha önceki yazımda en temel ve en yaygın olarak kullanılan Spring anotasyonlarından ve onların çalışma mantığından bahsetmiştim. Kısa ve öz bir şekilde anlattığım temel anotasyonlar ve çalışma mantıkları konulu yazıya şuradan ulaşabilirsiniz :

Spring için @SpringBootApplication, @Bean, @Configuration, @Component, @EnableAutoConfiguration, @ComponentScan anotasyonları
Yazının devamını oku
Bu yazıda en basit şekilde anotasyonların çalışma mantığı yer almaktadır. Ayrıca kısa ve öz bir şekilde, en çok kullanılan anotasyonlara, çalışma mantıklarına ve benzer anotasyonarla aralarındaki farklara değindim. Daha fazla bilgi edinilebilmesi adına yazı sonuna kaynakça listesi ekledim. Konuyla ilgili yorum ve görüşlerinizi yanın en altındaki yorum formu üzerinden iletebilirsiniz.

Yazının devamını oku
Zamanında forum sitelerinin birinde, bir kullanıcı, forum üzerinden şu soruları sormuştu.
  • PHP'nin sizce geleceği var mı?
  • İyi bir PHP programcısı ne kadar para kazanır?
  • Mobilleşme gittikçe artarken PHP değer kaybetmez mi?
  • Sizce hangi programlama dilinin geleceği var?

Ben de bu soruları kendime göre cevaplamıştım. Verdiğim cevabın güzel bir makale içeriği olabilecek nitelikte olduğunu düşündüm. Ufak tefek düzenlemeler yaparak yazıyı Blogkafem'de yayınlamaya karar verdim.

Öncelikle bu tarz sorulara, şu soruyla karşılık vermek gerek :
"Sen ilerde ne yapmak istiyorsun?" 
İlk başta bunu kafada belirlemek gerek. Web programlama üzerine mi kendinizi geliştireceksiniz? Yoksa oyun veya mobil uygulamalar üzerine mi? Eğer amacınız web programlama alanında kendinizi geliştirmekse, çoğunlukla piyasada şu 3 farklı dil ile web programlama yapılmaktadır :

  • JAVA + JSP
  • ASP.NET
  • PHP

Yalnız bu üçünden birini bilmek yeterli olmuyor. Bunlardan herhangi birini öğrendikten sonra mutlaka yanında Javascript (JQuery veya Ajax) öğrenmelisiniz ki yaptığınız yemeğin sosunu verebilesiniz.

Peki bu 3'ünden hangisini tercih etmeliyin diye soracak olursanız, şuanki piyasadan biraz bahsetmem gerekecek.

Günümüzde büyük şirketler genelde JAVA ve ASP'yi tercih ediyorlar. Orta ölçekli firmalar ve yazılım ajansları PHP'yi tercih ediyorlar. Bu açıdan baktığın zaman JAVA ve ASP bilmek, PHP'ye göre çok daha yüksek oradan maaşlar almak anlamına da gelebilir.

PHP ile kolay ve hızlı yazılım geliştirilir fakat; diğer dillere göre daha sonradan yayılmaya başladığı için biraz geriden geliyor. Mesela çok sonradan nesne tabanlı olarak kullanılmaya başlandı. PHP için yavaş yavaş gelişen bir dildir diyebiliriz. Geleceği kesinlikle var olan bir dil. Mesela PHP ile yazılmış bir kaç tanınmış site sayacak olursak : 

  • Gittigidiyor
  • Sporx
  • Facebook
  • Sahibinden.com
  • Wordpress

Bu liste daha da uzayabilir.
Daha önceden bahsettiklerimi de göz önünde bulundurarak bir yorum yapacak olursam, bu siteler, kişisel ve küçük çapta başlayıp da sonradan büyük patlama yapan siteler. Bundan dolayı da PHP ile başlamaları normaldir. Çünkü PHP, maliyeti düşük ve aynı zamanda hızlıca bir ürün ortaya koyabileceğin bir dil.

Oysaki büyük şirketelere ait web sitelerine (bankalar vs.) yada devlet kurumlarının internet sitelerine baktığımız zaman sitelerinin genelde ASP ve JSP ile geliştirildiğini görürsünüz. Örneğin Doğuş Holding'e ait olan N11.com sitesi JSP ile yazılmış. Diğer tüm büyük bankların ve devlet kurumlarının sitelerine bakarsanız %95 oranında JAVA veya ASP ile yazıldıklarını görürsünüz.

Sorulara kısaca cevaplar verecek olursak :

PHP'nin sizce geleceği var mı?
PHP'nin geleceği var. Özellikle son zamanlarda Laravel gibi PHP çatılarıyla beraber artık PHP'ye de nesne yönelimli bir özellik kazandırıldı. Laravel tarzı PHP çatıları sayesinde PHP'nin kullanımına olan ilginin daha da artacağı düşüncesindeyim.

İyi bir PHP programcısı ne kadar para kazanır?
Konu içerisinde bunu açıkladım ve kazanç olarak asp ve jsp'ye göre daha az kazanç sağlar gibime geliyor. Orta ölçekli firmalarda asgari ücret ile başlanır Büyük şirketlerde ise bu ücret asgarinin üzerinde olmak üzere, değişkenlik gösterebilir. Elbette ki, kişi kendini geliştirdikçe elde edeceği kazança da artacaktır.

Mobilleşme gittikçe artarken PHP değer kaybetmez mi?
Mobil ile beraber web programlama popülerliği artan iki alan. Bu durumun PHP'yi olumsuz etkileyeceğini düşünmüyorum şahsen.

Sizce hangi programlama dilinin geleceği var?
Yapacağın işe göre, takım arkadaşlarının veya bulunduğun şirketin kullanacağı programlama diline göre bu değişiklik gösterir. O yüzden herhangi bir programalama dilinin fanatiği olmamak gerek. Programlama dili ismi vermeyi çok doğru bulmasam da, kullanım olarak son zamanlarda Java'nın ciddi bir yükselişte olduğunu söyleyebilirim.

Yazdıklarıma ek olarak, kendi görüş ve düşüncelerinizi paylaşmak isterseniz, aşağıdaki yorum formu aracılığıyla bu yazıya yorum yaparak, kendi görüşlerinizi belirtebilirsiniz.
Yazının devamını oku
Daha önceki yazıda Laravel'in Mail kütüphanesinin send() fonksiyonu ile nasıl mail gönderileceğini blogda yazmıştım.

Bakınız : Laravel'de Eposta Gönderme İşlemleri ve Mail::Send() Fonksiyonun Kullanımı

Send() fonksiyonu ile mail göndermek için bir adet HTML içerikli Laravel blade şablonuna sahip olmanız gerekiyordu. Laravel'in sunduğu bir diğer mail fonskiyonu olan Raw fonksiyonu ile HTML şablonu kullanmanıza gerek kalmıyor. Bilgilendirme postaları gibi kısa içerikli ve HTML gerektirmeyen eposta gönderimlerinde son derece kullanışlı bir fonksiyon olduğunu söyleyebilirim.

Ancak bazen, Raw fonksiyonunu kullanırken HTML öğesi kullanma ihtiyacı duyabiliyoruz. Böyle bir durumda Raw fonksiyonu dahilinde HTML öğesi kullandığınız zaman, mailiniz kullanıcılarınız eposta kutularına HTML öğesi olarak gönderilmediği için, en basitinden bir br etiketi bile kullanıcıların mail adresinde normal bir text içeriği olarak gözüküyor.

Bakınız :


Bunu önlemek için



setBody($string,'text/html') fonksiyonu içerisine ilk parametre olarak HTML içerikli değişkeni yazmanız veya direkt olarak html içerikli text yazmanız, ikinci parametreye ise 'text/html' ifadesini yazmanız yeterli olacaktır.

Bakınız :

 

Bu şekilde kullanıcılarınıza gönderdiğiniz eposta içerikleri, bir Laravel blade şablonu kullanmışçasına daha düzgün görünecektir.
Yazının devamını oku
Android Studio kullanıyorsanız bu yazımda, Google Maps'i projenize eklemek için Google'ın bize inanılmaz derecede güzellikler sunduğunu göreceksiniz. Yazıdaki adımları uyguladığınız takdirde Android Studio sizin yerine hem XML uzantılılı activity dosyasını hem de MapsActivity.java dosyasını otomatik oluşturuyor. Üstelik de kodları bile içinde geliyor. Size ise sadece bir buton aracılığıyla MapActivity.java fonksiyonunu tetikleyerek activitiy_maps.xml sayfasını açmak ve haritayı görüntülemek kalıyor.

Öncelikle Android Studio'nun sağ tarafındaki kısımdan projeniz içinde yer alan app klasörüne sağ tıklayın  New -> Google -> Google Maps Activity adımlarını gerçekeştirin.

Bakınız :



Karşınıza şöyle bir ekran gelecek :



Bu ekranda değiştirmeniz gereken tek yer, üstte de görmüş olduğunuz üzere "Package" yazan kısım. Burada yazan "layout" ifadesini silip onun yerine, projenizdeki  build:gradle(Module: app) sayfasında yer alan "applicationId" ifadesinin karşılığı olan ifade buraya yazılacak. Mesela bende şu yazıyor, bakınız :



O halde layout kısmını silip o kısma benim "com.blogkafem.mobileuygulama" yazmam gerekiyor. Siz de Layout kısmına sizin projenizin "applicationId" ifadesini yazdıktan "Finish" butonuna tıklayın ve beklemeye geçin. İşlemler otomatik olarak başlayacaktır. İşlemlerin başladığını editörün en alt kısmından görebilirsiniz.

İşlemler başlamaz ise "Tools -> Android -> Sync Project with Gradle Files" adımlarını takip ederek işlemleri başlatabilirsiniz. İşlemler bittikten sonra karşınıza google_maps_api.xml sayfası otomatik olarak gelecektir. (Yan sekmede de MapsActivity.java dosyası da gelmiş olması lazım.) Şu şekilde;

 

google_maps_api.xml  dosyasının içinde üstten de göreceğiniz üzere kırmızı daire için aldığım uzun bir link var. Ona kopyalayın, tarayıcınıza yapıştırın ve "Enter" tuşuna tıklayın. Ardından karşınıza şöyle bir sayfa gelecek :




Bu sayfada "Continue" butonuna tıkladıktan sonra karşınıza şu sayfa gelecek :




Burada "Create API key" butonuna tıkadıktan sonra uygulama size bi API anahtarı verecek, şu şekilde :



Ne olur ne olmaz diye ben bu API anahtarının bir kısmını sansürledim gördüğünz gibi. Google size burada, yalnızca size özel bir API key veriyor. Bu Api key kodunu kopyalayıp, google_maps_api.xml dosyasında "YOUR_KEY_HERE" yazılı olan yere yapıştırmanız gerekiyor. Bakınız :



Tüm işlemler bu kadar! Geriye kalan tek şey uygulamayı çalıştırmak olacaktır fakat; uygulamayı çalıştırırken "The number of method references in a .dex file cannot exceed 64k" şeklinde başlayan bir hata ile karşı karşıya kalabilirsiniz. Çünkü Android, Google Maps gibi büyük kütüphaneleri projelerinizde kullanırken "Multidex" adı verilen bir özelliği kullanmamızı ister.

Siz bu yazıyı okuduğunuz için kendinizi şanslı hissetmelisiniz. Çünkü ben hem bahsettiğim hata ile ilgili hem de "Multidex özelliğinin kullanımı" ile ilgili daha önce detaylı bir şekilde anlatımlar yapmıştım. İlgili yazılara gitmek için;


Benim Android Studio'da Android Projesine Harita Ekleme işlemleri ile ilgili bahsedeceklerim bu kadar. Geriye sadece uygulamayı çalıştırmak kalıyor. Konuyla ilgili sormak istedikleriniz veya aklınıza takılan kısımlar varsa, aşağıdaki yorum formu aracılığıyla bana iletebilirsiniz. Elimden geldiğince yardımcı olmaya çalışırım.
Yazının devamını oku
Mail::send() fonksiyonunun kullanımına geçmeden önce Laravel'deki mail ayarlarınızın yapılmış olması gerekmektedir. Ben daha önceki yazımda Laravel'de Gmail uzantılı bir hesaptan nasıl mail gönderimi yapılacağını anlatmıştım.

Bakınız :   Laravel 5 İle Gmail'den Mail Gönderme Ayarlarının Yapımı

Farklı uzantılara sahip mail adreslerine sahipseniz ayarlarınızı Gmail için anlattığım ayarlarından yola çıkarak yapabilirsiniz.

laravel mail gönderimi, mail send


Mail::send() fonksiyonu çoğunlukla, Controller sınıflarında yer alan fonksiyonların içerisinde kullanılır. Örneğin şifremi unuttum uygulaması yapacaksınız. Bunun için 'sifremiUnuttum' adında, kendi yapmış olduğunuz bir fonksiyon aracılığıyla kullanıcının mail adresi bilgisini post metodu ile alırsınız. Daha sonrasında bu mail adresini Mail::send() fonksiyonuna ileterek, ilgili kişinin mail adresine şifresini göndermiş olursunuz.

Laravel'de hazır olarak gelen Mail::send() fonksiyonu şudur :


Mail::send() fonksiyonundan ve aldığı parametrelerden bahsedelim. İlk parametreye dikkat ettiyseniz, Mail::send() fonksiyonu içerisinde mail _sablonu adlı bir kısım var. Bu kısım, bir blade sayfasının adıdır ve bu blade sayfası html kodlarından oluşan basit bir mail şablonudur.

resource klasörü içindeki view adlı klasor içine bir adet  mail_sablonu.blade.php sayfası açıp aşağıdaki kodları içine yapıştırın.




İşlem tamam, artık sizinde bir mail şablonunuz var. Devam edelim.

Mail::send() fonksiyonunun ikinci parametresi dizi alan bir parametredir. Kullanıcıya mail içerisinde göndermek istediğimiz tüm bilgileri bu parametre aracılığıyla yolluyoruz. Mesela ben dizi içerisine sadece "içerik" adında tek bir eleman ekledim, siz ihtiyacınıza göre tek bir dizi olmak koşuluyla bu dizinin içerisine istediğiniz kadar eleman ekleyebiliriz. Bu dizide yer alan tüm elemanları, mail_sablonu.blade.php sayfasının istediğiniz bir yerinde görüntületebilirsiniz.

['icerik'=>"Hoşgeldiniz"]

Dizinin elemamının indisi "icerik" ve bu indis "Hoşgeldiniz" mesajını tutuyor. Bu fonksiyon tetiklendiği zaman, şablon kısmında {{icerik}} olarak belirttiğim kısımda "Hoşgeldiniz" yazacaktır ve kullanıcının mail içeriğinde kullanıcı "Hoşgeldiniz" mesajını görecektir.

Not : Çift parantez içerisinde değişken yazma özelliği için Laravel 'form & html' kütüphanesini projenize kurmanız gerek. Şayet onu kurmak uğrak istemezseniz icerik dizisini {{icerik}} şeklinde göstermek yerine direkt olarak php tagları arasında, echo kullanarak dizinin içriğini şablonun body kısmına yazdırabilirsiniz.

3. parametre "function($mesaj) use($eposta)" kısmı yer alıyor.  $mesaj değişkenini fonksiyonun içerisinde kullanacağımız bir nesne olarak düşünebilirsiniz. Bu $mesaj nesnesi to() ve subject() gibi Laravel'de daha önceden tanımlanmış olan fonksiyonları kullanmamızı sağlıyor. use() kısmı ise, $mesaj nesnesinin çağırdığı bu fonksiyonların içerisine göndereceğimiz parametrelerin neler olduğunun tanımlandığı yerdir.

to() fonksiyonu parametre olarak mail adresi alır. Mail göndermek istediğiniz e-posta adresini işte bu to() fonksiyonu içerisine yazıyorsunuz.

subject() ifadesi, mailiniz karşı tarafın e-posta kutusuna düştüğü zaman, mailinizin başlık kısmında yazacak olan ifadedir.

Sonuç olarak karşı tarafa giden mail şöyle olacak;
Mail konu başlığı : Blogkafem Hoşgeldin E-Postası
Mail içeriği : Hoşgeldiniz

Konuyla ilgili sormak istedikleriniz veya aklınıza takılan kısımlar varsa, aşağıdaki yorum kısmı aracılığıyla bana iletebilirsiniz. Elimden geldiğince yardımcı olmaya çalışırım.

Yazının devamını oku
Multidex özelliği, belli bir boyutu aşan android kütüphanelerinde kullanılması gereken bir özelliktir. Örneğin Google'ın harita kütüphanesi, Multidex kullanmayı gerektirir. Aksi takdirde uygulamanızı derlerken sürekli hata alırsınız. Buraya tıklayarak ilgili hatanın ne olduğunu görebilir ve multidex ile ilgili detaylı bilgi alabilirsiniz.

Multidex'i Android projenize ekleme işlemini Android Studio üzerinden anlatacağım. Android geliştirme ortamınız Android Studio ise şanslısınız ve yazıyı okumaya devam edin. Sabasit adımda Multidex'i android projenize eklemiş olacaksınız. Aşamaları adım adım takip edin.

1) Android Studio'nun sağ tarafındaki proje dosyalarınızın olduğu yerin alt kısımlarında "Gradle Scripts" kısmı var. Oradan build.gradle(Module:app) yazılı olan yere tıklayın. Bakınız :

build.gradle_module:app
Buradaki sayfada "defaultConfig " adında bir alan var ve parantezler içerisinde uygulamanıza ait bir takım veriler var. O verilerin hemen alt kısmına şunu ekleyin;

 multiDexEnabled true

Yine aynı sayfada "dependencies" adında bir alan var bu dependencies kısmının parantezleri arasına ise şunu ekleyin;

compile 'com.android.support:multidex:1.0.0'

Sonuç olarak, bir örnek vermem gerekirse build.gradle(Module:app)  dosyasına genel olarak bu belirttiğim iki kod parçası şu şekilde ekli olmalı :

Bu örnek gösterim developer.android.com sitesiden alınmıştır.
2) Bu adımda AndroidManifest.xml dosyasını açmanız gerekmektedir. Bu dosyada,


android:name="android.support.multidex.MultiDexApplication"

Android'in kendi sayfasından alınan örnek gösterim için bakınız :


Bunu ekledikten sonra hata alır gibi kırmızı bir uyarı alırsanız sakın aldırmayın. Dosyayı Ctrl+S tuş kombinasyonu ile kayıt edin ve 3. aşamaya geçin.

3) Üst menüden, Tools -> Android kısmına gelin ve "Sync Project with Gradle Files" yazılı yere tıklayın ve eklemiş olduğunuz paketlerin projenizle senkronize olmasını bekleyin. İşletm bittikten sonra projenizi derleyin ve multidex sorununuzun çözülmül olduğunu göreceksiniz.

Konu ile ilgili detaylı bilgilere ulaşmak için şu linke tıklayarak, https://developer.android.com/studio/build/multidex.html#dev-build Google'ın Android geliştiricileri için hazırlamış olduğu Multidex dökümanını incleyebilirsiniz.

Yazının devamını oku
Minimum SDK, Android Studio'da bulunan ve uygulama geliştirmek istediğiniz Android sürümünü seçmenize yarayan bir menüdür. Bu menüden bir SDK çeşidi seçerken Android'in hangi versiyonlar için uygulama yazmak istediğinizi önceden bilmeniz gerekiyor.

Android'in sadece son sürümleri için uygulama geliştirmek istiyorsanız, yeni sürümlerini seçerek uygulama geliştirmeye başlayabilirsiniz. Fakat, Android'in sadece son sürümlerine uygun uygulamalar geliştirmenizin getirdiği dezavantajlardan bir tanesi, uygulamanızın eski Android versiyonlarda çalışmayacak olmasıdır. Durum böyle olunca ise, yazdığınız uygulama daha az kişiye hitap edecektir anlamına geliyor.  Avantajı ise, daha çok API çeşidi destekliyor olmasıdır.

Android'in eski sürümleri için uygulama geliştirmek istiyorsanız, eski sürümlerden birini seçerek uygulamanızı geliştirmeye başlayabilirsiniz. Eski sürümler için uygulama geliştirmenin avantajı ise, yazdığınız uygulamanın yeni Android versiyonlarında da çalışabiliyor olmasıdır. Bu da uygulamanızı daha fazla kişiye sunabileceğiniz anlamına geliyor. Android'in eski versiyonlarında uygulama geliştirmenin dezavantajı ise daha az API destekliyor olmasıdır. Yani Android'in eski bir versiyonu için uygulama geliştirirdiğiniz sırada, yeni Android sürümlerinde kullanılmak üzere geliştirilen özellikleri, uygulamanızda kullanmayacağınız anlamına geliyor.



Örneğin, Android'in 2.3 versiyonları için uygulama geliştirecekseniz eğer, geliştirme esnasında çok daha fazla şeye dikkat etmeniz gerekiyor. Çünkü Android 4.0'dan sonra gelen bir çok yeniliği kullanamayacaksınız. Bunun içim ise ya Support Library kullanacaksınız ya da Third Party Library'den istifade edeceksiniz.

Bununyüzdendir ki yazacağınız uygulamaya göre SDK seçmeniz faydanız olacaktır. Örneğin form verisi post eden basit bir uygulama geliştirdiniz, bunun için API leveli 13 olan bir Android versiyonu seçmenize gerek yok. Bunun için Android 1.5'tan itibaren çalışabilir bi uygulam yapabilirsiniz. Böylece uygulamanız hemen hemen tüm Android sürümlerinde çalışacaktır. Daha büyük uygulamalar için ise Android 1.5 çoğu API'yı desteklemediği için, uygulamanızı geliştirirken kullanacağınız araçlara göre bir SDK seçmelisiniz.

SDK seçerken şu link işinize yarayabilir : http://developer.android.com/about/dashboards/index.html

Bu linkteki tabloda kullanıcılarıni dünyadaki Android sürümlerinin kullanım oranı ve geliştirme açısından Android sürümlerinin desteklediği API çeşitleri sunulmuştur. Bu linkteki tabloya göre kendinize göre, uygulama geliştirmek istediğiniz Minimum SDK versiyonunu seçebilirsiniz.

Ayrıca SDK seçerken, seçim ekranında da anlık olarak tüm dünyada, hangi Android sürümünün kullanıcılar tarafından yüzde kaç oranında kullanıldığını da görebilirsiniz.

Bakınız :

Ekran görüntüsündeki yüzde kısmına tıklayarak da, tüm sürümlerin ayrı ayrı desteklediği API'leri ve kullanıcılar tarafından kullanım oranlarını görüntüleyebilirsiniz.

Yazının devamını oku
PHP'de Regex yani Türkçe ifade edecek olursam "Düzenli İfadeler" konusuna göre PHP'de şifre kontrolü yapmak oldukça basit. Genel olarak bakıldığında düzenli ifadeler konusunun anlaşılması yeni başlayanlar için biraz karmaşık olabilir.

PHP'deki düzenli ifadeler (regex) konusunu daha iyi kavrayabilmeniz açısından sizlere www.phpliveregex.com sitesine benzer siteler üzerinden regex ifadeleri ile ilgili  pratik yapmanızı tavsiye ederim.


Şifre kontrolü, bir siteye kayıt olan kullanıcıların kişisel hesaplarının güvenliği açısından günümüzde büyük siteler tarafından çokça tercih edilen bir yöntemdir. En basitinden bir örnek vermem gerekirse, outlook.com üzerinden hesap açarken kendi kafanıza göre bir şifre belirleyemiyorsunuz. Kayıt olurken belirlediğiniz şifrenin, sistemin belirlediği şifre kurallarına uygun oluncaya kadar kayıt işleminiz tamamlanmıyor. Bu da kişisel olarak kullanıcıların güvenliği için oldukça önemli bir kontroldür aslında.

Bir üyelik sistemi tasarladık ve tasarladığımız bu üyelik sisteminde kullanıcının, kendi şifresini belirlerken şu şartlara uygun bir şifre girmesini isteyelim :

1) Şifre en az 8 karakter olmalı
2) Şifrede en az 1 tane büyük harf bulunmalı

Bu şartlara uyulmadığı takdirde sistem üyelik işlemini gerçekleştirmesin ve şifrenin uygun formatta olmadığına dair kullanıcıya uyarı mesajı verilsin.

Belirlediğimiz formata uygun bir şifrenin kontrolünü ise regex denilen düzenli ifadeler ile sağlayacağız. Bu yazıda elbette ki komple bir üyelik sistemini yapmayacağım. Sadece kayıt formuna şifre girildiği zaman, girilen bu şifrenin kontrolünün nasıl yapıldğını göstereceğim.





$kontrol = "/\S*((?=\S{8,})(?=\S*[A-Z]))\S*/"; 
kodunun açıklaması :


 \S{8,} ifadesine göre şifrenin en az 8 karkaterli olması gerektiğini belirttik. Virgülden sonra ise bir sınırlama koymadık. Yani en 8 karakter şartını sağladığı sürece, kullanıcı şifreyi istediği uzunlukta belirleyebilir.

(?=\S*[A-Z]) ifadesine göre şifre mutlaka bir büyük harf içersin istiyoruz. İşin mantığı ise şudur, karakter olarak klavyeden ne gelirse gelsin hiç önemli değil. Önemli olan yazılan şifre içinde en azından 1 tane büyük harf olmasıdır.

\S ifadesi boşluk dışındaki herhangi bir karakteri bulur. (Boşlukları görmezden gelir.)
\s ifadesi boşluk (space) bulur.
* (yıldız) ifadesi bir karakterin birden çok kez tekrar edebiliceğini belirtiyor.

Normal şartlarda, yakalamak istediklerimiz parantez için yazılır. fakat istediğimiz şifrede "NE GELİRSE GELSİN HİÇ ÖNEMLİ DEĞİL AMA BU İFADE MUTLAKA OLSUN!" diyebileceğimiz karakterler de olabilir. Bu tür ifadeler için soru işareti kullanılır. Örneğin; (?= ... ) gibi.

Bu konuyla ilgili benim anlatacaklarım bu kadar. Şifre kontrolü ile ilgili Blogkafem dışında kapsamlı bir anlatım yapan bir site ile karşılaşmadığım için bunun da anlatımını ben yapayım dedim. Umarım PHP'ye yeni başlayan arkadaşlara faydalı olur. Öneri, istek, görüş ve düşüncelerinizi aşağıdaki yorum formuna yazabilirsiniz. Hepinize hatasız ve tıkır tıkır çalışan kodlamalar dilerim. :)

Yazının devamını oku
Sürekli olarak daha da güçlü bir hale getirilen internet programlama dili olan PHP dili, PHP 5.x sürümlerinin çıkması ile beraber bazı yenilikleri de beraberinde getirdi. Bu yeniliklerden biri de MySql'den MySqli'ye olan geçiş.


PHP 5.X versiyonları eski kütüphane ve fonksiyonların çoğunu desteklese bile mysql_query() gibi geçerliliğini yitiren bazı fonksiyonlar da mevcut. Bir hosting firmasına yüklediğim PHP dosyalarımda mysql_query() fonksiyonu bulunan sayfaların hepsinin hata vermesi sonucunda bu durumun farkına varmış bulunmaktayım. Aldığım hatada da zaten artık mysql_query()'in geçerliliğinin olmadığını ve mysqli_query()'e geçiş yapmam gerektiği yazıyordu.

mysqli_query() Nasıl Kullanılır?

Normal şartlar altında eğer siz de mysql_query fonksiyonu içerisine bir veritabanı sorgusu yazacağınız zaman;



tarzında bir kullanım yapıyorsanız, msyqli ile beraber artık bunu şu şekilde yazmanız;



aldığınız hataların çözülmesinde sizlere yardımcı olacaktır.

$baglanti olarak belirttiğim şey ise, veritabanı bağlantısını sağlayan mysql_connect fonksiyonundan aldığım bilgileri içeren bir değişkendir. Yani şudur :

Yazının devamını oku
C# programlama dili, Windows işletim sistemine sahip platformlar için masaüstü programlar ve çeşitli uygulamalar yapmaya yarayan bir programlama dili olduğunu belki birçoğunuz biliyorsunuzdur. Daha önceki yazımda C# ile CocaCola ve Pepsi Şifresi Üreten Program'ın yapımını göstermiştim. Bu yazımda ise, yapacağımız bir masaüstü programı ile otomatik olarak Google üzerinden arama yapmanın nasıl olacağını göreceğim.

Belki size daha başka projelerinizde yol gösterici olur diye sadece mantığının nasıl olduğunu görmek açısından C# ile Google arama motoru yapımını size çok basit bir şekilde göstereceğim. İnternette bunun nasıl olacağını anlatan birkaç site mevcut fakat o sitelerde yazılan kodlar artık geçerliliğini yitirmişler.

Biliyorsunuz ki Google artık eski Google değil, arama yapmak için birkaç harf girişi yapmaya başladığınız andan itibaren sonuçlar görüntülenmeye başlıyor. Google'ın bu yeniliği sebebiyle ise masaüstü Google arama programı yapmak için daha önceden kullanılan kodlar artık çalışmamaktadırlar ve HTML ELEMENT mantığıyla yazıldıklarından daha çok kod yazmak zorunda kalabiliyoruz. Anlatacağım yöntemde kodların çok az olmasına şaşıracaksınız. Üstelik bu yöntemi düşünürken HtmlElement'lerden değil, sadece stringlerden faydalandım. HtmlElement ile de bir çözüm üretilebilirdi elbette ama dediğim gibi kodlar daha da uzayacaktı.

HtmlElement olmadan Google'da C# ile Google arama motoru yapımı nasıl olur diye düşünürken aklıma son derece güzel bir yöntem geldi. Göstereceğim yöntemi bizzat denedim ve çalışıyor. Bu sebeple başlığa da "güncel" yazdım. Bu yöntem ile beraber aramaları direkt olarak link üzerinden yapacağımız için, çok sağlam bit yöntem olduğunu söyleyebilirim.

Google'da birkaç tane arama yaptım ve hepsinin linklerini tek tek inceledim ve bunun sonucunda bazı elemeler yaparak sade bir linke ulaştım. Eğer Google Chrome veya Mozilla Firefox kullanıyorsanız bu basit linke ulaşmanız zor olabilir ama Internet Explorer'de arama yapmayı denerseniz eğer, Google aramalarda kullanılan anahtar linkin şu olduğunu göreceksiniz : https://www.google.com/search?q=Aranacakİfade

Linki tarayıcınıza yapıştırın ve koyu siyah renk ile yazdığım "Aranacakİfade" kısmını silip oraya aramak istediğiniz kelimeyi girin. Google ile sağlıklı bir şekilde arama yaptığınızı göreceksiniz.

Birkaç örnek;
https://www.google.com/search?q=blogkafem
https://www.google.com/search?q=aliarslan10
https://www.google.com/search?q=blogkafemi seviyoruz
https://www.google.com/search?q=blogkafem.net

İşin mantığını anladıysanız eğer, şimdi ise kodlama aşamasına geçelim. Kodlama aşamasında bize lazım olacak şeyler;
  • 1 tane webBrowser
  • 1 tane textbox
  • 1 tane buton
 Tasarımımız yaklaşık olarak şu şekilde olacak yani;



 Google'da Ara Butonu İçine Yazılacak Olan Kodlar :

Bunun dışında hiçbir kod yok arkadaşlar. Gördüğünüz gibi, diğer sitelerdeki yöntemlere göre oldukça  basit!

Ayrıca Form1() içine;
webBrowser1.ScriptErrorsSuppressed = true;

kodunu eklerseniz, programınız ile Google dışı sitelerde gezerken olası hataları da önlemiş olursunuz.

Programın videosu;

Yazının devamını oku
Teknoloji sektörü şu sıralar patlama yaşıyor. Eğer son bir kaç yıl içinde bir bilgisayar ya da akıllı telefon kullandıysanız bunu muthemelen farketmişsinizdir.

Sonuç olarak kodlama becerilerine yüksek ihtiyaç duyuluyor. Bu da bir şirkette programlama işleriyle ilgilenen kişilerin ödemelerinin, ortalama işlerden daha yüksek ödeme aldığını gösteriyor. Hatta teknoloji dünyasının ötesinde bir programlama dili en az bir yaşam öyküsü kadar etkileyici bir durum yaratır.

Proglamlama dilleri istihdam sektörüne göre değişiklik gösterirler.

Finansal ve kurumsal sistemler, karmaşık işlemleri gerçekleştiren ve son derece organize olan Java ve C# gibi dillere ihtiyaç duyar. Medya ve tasarım ile ilgilenenler web sayfalarını daha dinamik, çok yönlü, fonksiyonel ve az koda ihtiyaç duymalarından dolayı Ruby, PHP, JavaScript ve Objective-C gibi dillere gereksinim duyarlar.

Bizde size bu yazımızda öğrenmeniz gereken 10 proglama dilini anlatacağız.

1) Java







Java 1990'larda Sun Microsystems tarafından geliştirilen bir sınıf tabanlı nesne yönelimli proglamlama dilidir. En çok talep gören proglama dili olan Java, kurumsal yazılım, web-tabanlı içerik, oyunlar ve mobil uygulamaların yanı sıra Android işletim sistemi için de kullanılır. Java birden çok platform üzerinde çalışır. Örnek vermek gerekirse Mac OS X üzerine yazılmış bir program aynı zamanda Windows üzerindede çalıştırılabilir.


2) C Dili 

1970'lerin başında geliştirilen genel amaçlı, zorunlu programlama dilidir. C en eski ve en yaygın olarak kullanılan bir dildir. C dili C#, Java, JavaScript ve Pyton gibi diğer popüler dillerin yapı taşlarını oluşturmuştur. C dili çoğunlukla işletim sistemleri ve gömülü uygulamaları gerçekleştirmek için kullanılır. Çünkü diğer diller için temel oluşturur. Diğer dilleri öğrenmeden önce ilk olarak C ya da C++ öğrenilmesi tavsiye edilir.


3) C++ 







C++ ilk başlarda C dilini geliştirmek için tasarlanmış, nesne yönelimli ve orta düzey bir programlama dilidir. Firefox, Winamp ve Adobe gibi bir çok büyük yazılım C++  tarafından geliştirilmişt. C++ sistem yazılımlarını, uygulama yazılımlarını, yüksek performans veren sunucuları ve video oyunlarını geliştirmek için de kullanılır.


4) C# 







NET girişiminin bir parçası olarak Microsoft tarafından geliştirilen çoklu paradigma dilidir. "C-Sharp" olarak telafuz edilir. C ve C++ ilkelerini birleştiren C#, Microsoft ve Windows platformları için yazılım geliştirmek için kullanılan genel amaçlı bir dildir.


5) Objective-C 

Objective-C, Apple şirketine ait tüm cihazların işletim sistemlerinde kullanılan nesne yönelimli, genel amaçlı programlama dilidir. API'nın yanı sıra Apple'ın OS X ve iOS işletim sistemlerine güç veren Objective-C dili, iPhone telefonlar için uygulama oluşturmak içinde kullanılır.



6) PHP 







PHP (Hypertext Processor), dinamik web siteleri ve uygulama geliştirmek için tasarlanmış sunucu tarafından komut dosyası alan ücretsiz bir programlama dilidir. Bu doğrudan harici bir dosya olabileceği gibi HTML belgesi içinede gömülmüş olabilmesi, PHP dilini web geliştiricileri için popüler hale gelmesini sağlamıştır. PHP dili Facebok, Digg ve Wordpress başta olmak üzere 200 milyondan fazla siteye hayat verir.


7) Python

Python web siteleri ve mobil uygulamalar için tasarlanmış yüksek seviyeli bir dildir. Okunabilirliği ve kompakt sözdizimi anlaşılabilir olduğundan yeni başlayanlar için oldukça kolay bir dil olarak kabul edilir. Yani geliştiriciler bir kavramı yazarken diğer dillerde olduğundan daha az kod kullanır. NASA, Google ve Yahoo tarafından kullanılır.


8) Ruby







Web siteleri yaratmak ve mobil uygulama geliştirmek için tasarlanmış olan Ruby programlama dili,  dinamik ve nesne yönelimli olmakla birlikte, basit ve yazması kolay olan bir programlama dilidir. Python gibi Ruby de yeni başlayanlar için önerilen kullanıcı dostu bir dildir.


9) JavaScript

JavaScript bir istemcidir. Netscape tarafından geliştirilmiş C'nin söz diziminden türeyen sunucu yönelimli betik bir dildir. Birden çok web tarayıcısı üzerinde kullanılabilir. İnteraktif veya animasyonlu web işlevlerini geliştirmek için gerekli olan dildir. Ayrıca oyun geliştirme ve masaüstü uygulamalarında da kullanılmaktadır. JavaScript sözleri Google'ın Chrome uzantıları, Apple'ın Safari uzantıları, Adobe Acrobat ve Reader içine gömülüdür.


10) SQL








SQL ilişkisel veritabanı yönetim sistemleri ve verileri yönetmek için tasarlanmış özel amaçlı bir dildir. Çoğunlukla "Query"(Sorgu) fonksiyonu veritabanlarındaki bilgileri aramak için kullanılır. SQL Amerikan Ulusal Standartlar Enstitüsü(ANSI) ve Uluslararası Standardizasyon Örgütü(ISO) tarafından 1980'lerde standardize edilmiştir.

Mashable
Yazının çevirisi BLOGKAFEM.NET için, Ahmet Umut Şerefoğlu tarafından yapılmıştır. 


Yazının devamını oku
Daha önceki yazımda yazdığım pointer konusunun mantığını anladıysanız bunu anlamanız zor olmayacaktır. Tanımladığımız bir dizi içerisinde pointerları kullanarak gezebiliriz.

Örnek bizi dizi tanımlayalım.

int dizi[5] = {3,5,8,9,7};

Dizilerin mantığından da anlayacağınız üzere dizi içerisindeki her bir elemanın bir adresi bir de indisi vardır. İndis ve adres farklı şeylerdir. Mesela üstteki 5 elemanlı diziyi ele alalım.

0. indisteki eleman = 3 
1. indisteki eleman = 5
2. indisteki eleman = 8
3. indisteki eleman = 9
4. indisteki eleman = 7
 
(Bildiğiniz üzere dizi elemanları sıfırıncı indisten başlar.)

Bu değerler arasından 1. indisli 5 sayısını ele alacak olursak 5 değerinin bulunduğu indis 1'dir ama adresi 0x7ffd084 gibisinden karmaşık bir ifadedir.

Bildiğiniz gibi işaretçiler(pointer) adresler üzerinden işlemler yapmamızı sağlayan bir kavramdır. 

int *p;
p = dizi;

yaparsak eğer, biz dizinin 1. değerinin adresini p işaretçisine atamış oluruz. Başka bir ifade ile 0. indisin adresini, p'ye atamış oluruz.


Yani biz bu aşamadan sonra;
cout << *p;

yaparsak; ekrana dizinin 1. elemanını atamış oluruz. Peki dizinin diğer elemanlarına nasıl ulaşabiliriz?


Dizi içerisindeki ifadeler bilgisayar hafızasında sıralanmış ifadelerdir. Bunlar birbirleri ile bağlantı içindedirler. Bu sebeple biz;

p++;
cout << *p;

yaparsak... Dizinin 2. elemanını ekrana yazdırmış oluruz. Burada pointerın adresini 1 arttırdık. Pointer ifadesi dizinin ilk adresini tutuyordu. Yada başka bir ifade ile dizinin 1. elemanının adresini işaret ediyordu. Biz bunu bir arttırarak p'nin artık dizinin 2. elemanının adresini işaret etmesini sağladık. Çünkü biliyoruz ki dizi içerisindeki elemanların adresleri bilgisayar hafızasında sıralıdırlar.

Bakınız ekran görüntüsü :


Ben tek tek yazdırdım ama 1. cout ifadesini ve p++ ifadesini bir for döngüsü içine atarsanız tüm elemanları kolaylıkla ekrana yazdırabilirsiniz.


Ayrıca, pointerlar ile ekrana yazdırma işini, diziler gibi şu şekilde de yapabiliriz :




Konun daha rahat kavranması açısından basit örnekler verdim. Burada verdiğim örnekler mantığın kavranmasına yönelik örneklerdir. Aklınıza takılan yerleri aşağı kısma yorum olarak yazabilirsiniz.
Yazının devamını oku
C yada C++ dillerini yeni öğreniyorsanız yada ilk defa bir programlama dili öğreniyorsanız pointer mantığını anlamakta biraz zorlanabilirsiniz. Yeni başlayanlar için kavraması biraz karmaşık olduğundan bu konuyu ele almak istedim. Bu yazıdan sonra artık pointer kavramının mantığını kolaylıkla kavrayacağınızı düşünüyorum.

Pointer dediğimiz şey bir işaretçidir ve adres tutar. Bu klasik tanımdır. Pointer olarak tanımlayacağımız ifadenin başına yıldız(*) işareti koyarak "bu ifade bir pointer ifadedir" deriz bilgisayara. Mesela;

int p;
olarak tanımladığımız bir ifadede p ifadesi integer yani sayısal değerler tutan bir ifadedir deriz. Sadece sayısal değerleri tutar. Fakat bu ifadeyi şu şekilde tanımladığımız zaman;

int *p;

bu p ifadesi için şunu demiş oluruz :  "p ifadesi bir pointer'dır. p ifadesi bir işaretçidir ve sadece adres tutar!"

Tırnak içinde belirttiğim cümleye dikkat edin. "p ifadesi" dedim. "*p" ifadesi demedim. İşte asıl karmaşıklık burada başlıyor.

*p ifadesi tanımlama ve kullanım aşamalarında farklı görevler üstlenir. Eğer ki siz herhangi bir ifadeye "bu ifade bir pointer'dır!" demek istiyorsanız tanımlama aşamasında o ifadenin başına yıldız (*) ifadesini eklersiniz.

Önce tanımlama aşamasından başlayalım anlatmaya...
Birkaç örnek vermem gerekirse,

int *a;  // "a" ifadesi bir pointer'dır ve adres tutar.
int *ptr;  // "ptr" ifadesi bir pointer'dır ve adres tutar.
int *b;  // "b" ifadesi bir pointer'dır ve adres tutar.

tanımlama aşamasında kullandığımız her yıldızlı(*) ifade bu anlamlara gelir.

Pointer olarak tanımlanmış ifadeyi kullanım aşamasında ise yıldızlı(*) ifade değer tutan bir ifade görevindedir. (Kullanım aşamasında derken, tanımlama sonrası değer atama veya ekrana yazdırma işlemleri vs.)

*a  ifadesi değerin kendisini tutar; a ifadesi ise o değerin adres bilgisini içerir.
*ptr  ifadesi değerin kendisini tutar; ptr ifadesi ise o değerin adres bilgisini içerir.
*b  ifadesi değerin kendisini tutar; b ifadesi ise o değerin adres bilgisini içerir.

Örnek : ptr ifadesinin değeri 5 ise; bu ifadenin adresi : 0x7ffd084 gibisinden, RAM bölgesindeki adresi gösterir.

Kısacası, kullanım aşamasında, pointer bir ifade var ise elimizde, bu ifadenin başında yıldız var ise değerin kendisi gösterilir, başında yıldız yok ise değerin adresini gösterir.

Yani bunun çıktısını cout ile aldığımız zaman;
*ptr ifadesi ekrana = 5 değerini gösterir.
ptr ifadesi ekrana = 0x7ffd084 değerini gösterir.

 Bakınız :


Ekran görüntüsünün açıklaması :
"p" ifadesi adres tutan bir ifade olduğu için, ona yalnızca başka bir ifadenin adresi atanabilir. Mesela üstteki ekran görüntüsüne göre p = a yapamazdık. Yani a ifadesini p ifadesine atarsak hata alırız. Çünük a, 5 e eşittir. Halbuki p ifadesi değer değil adres tutar. O yüzden de a'nın adresini p'ye atamamız gerekiyor. Herhangi bir ifadenin de adres bilgisine anpersan(&) ifadesiyle ulaşılır.

p = &a;

yaparak biz, a'nın adresini p'ye atadık. a'nın adresi derken biz aslında 5 değerinin bilgisayar hafızasındaki adresinin bulunduğu yeri p'ye atadık. p ifadesi de artık aynı adrese sahip olduğu için; *p ifadesi bize 5'i verecektir. Yani p bize 5'in adresini ve *p bize adresin sahip olduğu değeri verir.

Son olarak şu ekran görüntüsü aklınızda bazı şeylerin daha da netleşmesini sağlayacaktır diye düşünüyorum :


Pointer konusunun mantığı budur. Eğer aklınıza takılan yerler var ise, alt kısma yorum olarak yazabilirsiniz. Size elimden geldiğince yardımcı olmaya çalışırım.
Yazının devamını oku
Verilerin bilgisayar hafızasının belli bir bölümüne yerleştirilip saklanması olayıdır. Bu veriler birbiri ile bağlantılı olacak şekilde hafızaya yerleştirilir. İhtiyaç duyduğumuz herhani bir zamanda ise, en baştaki veriden başlayarak hafızanın o bölgesindeki diğer tüm verilere istediğimiz zaman ulaşabilme imkanını sağlayan bir veri yapısıdır.

Kısacası amaç, hafızada bir veri kümesi oluşturmak ve oluşturduğumuz bu veri kümesindeki, istediğimiz herhangi bir bilgiye ulaşmak.

Daha somut bir örnek vermek gerekirse, bir iş yerindeki personelleri düşünün. Tüm bu personellerin bilgilerini içeren bir dosya düşünün. O dosya, bizim veri kümemizdir. İhtiyaç duyduğumuz herhangi bir zamanda ise o dosyanın sayfalarını tek tek kurcalayarak istediğimiz zaman istediğimiz personelin bilgisine nasıl ulaşabiliyorsak, bilgisayar hafızasında oluşturacağımız veri kümemesindeki, istediğimiz bir veriye de aynı şekilde ulaşabileceğiz.

Veri kümesindeki tüm bilgiler birbirine şu mantıkla bağlanıyorlar :
Resmi büyütmek için üzerine tıklayınız.


Yapacağımız örnek üzerinde konuyu anlatmaya çalışacağım. Üstteki örnekte olduğu gibi çalışmamızı integer veriler üzerinde yapacağız. Zaten okullarda da genelde öyle gösterilir.

İlk önce Dugum adında bir sınıf oluşturalım. (Struct ile de yapılabilir.) Bu Liste bizim veri kümemiz olacak. Sınıfa düğüm adını vermek demek, oluşturacağımız listenin adı "Dugum"dur demek oluyor. Yani listemize "Dugum" adını verdik.Düğüm adlı sınıf yapımızdan düğümler oluşturacağız. Bu kısım size karışık gelmesin. Demek istediğim şey, "Dugum" adında bir listemiz var ve biz bu "Dugum" adını verdiğimiz listede kullanmak üzere, "Dugum" sınıfından çift bölmeli olan düğümlerden oluşturacağız. Düğümlerin birleşimi ise bize "listeyi" oluşturacaktır.

Bakınız :















Oluşturduğum liste içindeki düğümlerde ortak olarak kullanacağımız 2 farklı yapıya ihtiyaç duyacağız. Bunların biri, verileri saklayacak olan int tanımlı bir yapı olacak. Diğeri ise, bir sonraki düğüme ulaşmamızı sağlayacak olan bir pointer yapısı olacak.

Oluşturduğumuz listeden yola çıkarak her bir düğümü;

Dugum p1 =  new Dugum();

şeklinde oluşturacağız. Şuanda p1 adında bir düğüm oluşturmuş olduk.




Dugumlerimizi oluşturduktan sonra, her bir düğüme veri ataması yaptık.
Çünkü biz iliyoruz ki  her bir düğüm;
1- Veri saklar.
2 - Sonraki düğümün verisinin adresini saklar.

biz ilk önce veri atamalarını yaptık. Birinci düğüm olan p1'e 1 verisini atadık. p1 düğümünün verisi 1'dir dedik ve bilgisayar bellekte, p1 düğümünün veri kutucuğunda 1'yi sakladı.
p2 düğümüne 4 verisini atadık,
p3 düğümünün veri kısmı 3 bilgisini saklıyor,
p4 düğümü de 5 bilgisini içeriyor.

Daha sonra ise, p1 -> pSonraki = p2 ifadesinden başlamak üzere tüm düğümleri birbirine bağladık. Yani, p1 düğümünün adres saklayan kısmı olan 2. bölmesine; p2 verisinin adresini sakladık.

p2'nin verisi neydi? - p2'nin verisi 4'idi. Bir önceki aşamada p2 -> veri = 4 yaparak p2 düğümüne veri olarak 4'ü atamıştık çünkü. Dolayısıyla p1 düğümünün adres kısmı, 4 sayısının adresini tutuyor.

p2'düğümü ise, p4 verisinin adresini tutuyor.
p4 düğümü, p3 düğümünün verisinin adresini tutuyor.
p3 düğümü ise, adres kısmında hiçbir verinin adresini tutmuyor. Çünkü p3 düğümü listenin son düğmüdür ve kendisinden sonra başka düğüm gelmemektedir. p3'ün adres taşıyan kısmına bu yüzden de direkt olarak NULL yazıyoruz.

Dikkat ettiyseniz her bir düğüm bir sonraki düğümü işaret ederek aslında bir liste oluşturdular.
p1'den sonra p2'yi işaret ederek, aynı zamanda p1'den sonra p2 geliyor dedik.
p2'den sonra p4 geliyor dedik.
p4'ten sonra p3 geliyor dedik.
p3'ten sonra bir şey gelmiyor, NULL yazarakda başka bir düğüm gelmediğini belirttik.

Ben bu şekilde bağladım. Siz kafanıza göre daha farklı şekillerde de bağlayabilirsiniz düğümleri.

Gördüğünüz gibi, tüm düğümler birbiri ile bağlantı içinde oldu ve bir liste meydana geldi :


Liste İçinde Gezmek / Listedeki Tüm Verileri Konsolda Listelemek

Şimdide programı çalıştırıp, girdiğimiz tüm verileri yazacağımız kodlar aracılığıyla konsol ekranında listeleyeceğiz.

Verileri listelemek için sadece ilk düğümü bilmek bize yetecektir. Tek yönlü bağlı listelerde ilk düğüm çok önemlidir. Çünkü tüm işlemler ilk düğüm üzerinden gerçekleştiriliyor. İlk düğümü kaybetmek demek, listeyi kaybetmek demektir. Gezme işlemini de ilk düğümümüz olan p1'den başlatacağız.

Ben elemanları listelemek için yazmamız gereken kodu, ayrı bir fonksiyon oluşturarak yazacağım. Hepsini main içine yazıp, main içini karıştırmaktansa ayrı bir fonksiyonda yazmak göze daha hoş gelir. İsteyen kodları main içinde yazabilir. Ben ayrı bir fonksiyon oluşturacağım için ilk önce main'in hemen üst kısmında, yani class ile main arasında "listele" adında bir fonksiyon oluşturdum ve kodları da onun içine yazdım.

Bakınız :








*** Eğer siz de listeleme işlemini benim gibi bu şekilde ayrı bir fonksiyon içinde yapacaksınız, fonksiyonun çağrılıp ekrana basılması için, main kısmına listele(p1); yazmayı unutmayınız!

Burada bilmeniz gereken şey, p1 düğümünü olduğu gibi while içinde kullanmamanız gerektiğidir. Ben p1 düğümünü, pBas dügümüne atadım. Resimde de gördüğünüz üzere bunu fonksiyon içinde yaptım. Eğer siz bu while döngüsünü main içinde yaptıysanız, şunu yapmanız gerekiyor :

Dugum *pBas;
pBas = p1; 

daha sonra ise, pBas'ı while içinde kullanmanız gerekiyor. Bunu yapmamızdaki amaç, orjinal düğümümüz olan p1'i kaybetmemektir. Bundan sonraki yapacağımız ekleme, çıkarma vs. gibi işlemlerde hatalı sonuç çıkmasının önüne geçmektir.

pBas aslında yine p1'dir. Bunlar birbirinin aynısıdır. Bunu yaparak p1'i sonraki işlemlerde kullanmak üzere saklamış olduk. pBas ise, ilk dügüm olduğu için kendisinden başlanarak while döngüsü içinde tüm düğümlere tek tek uğrayıp verisini ekrana yazdırarak listeyi gezmiş olduk.

Şuanda pBas'ın p1 olduğunu düşünerek while döngüsünü inceleyelim.

Satır satır açıklayacak olursam;

13. Satır : While döngüsüne, pBas NULL olmadığı sürece verileri ekrana yazdırmaya devam et dedim.

15. Satır : pBas'ın o an için sahip olduğu veriyi yazdır anlamına geliyor.

16. Satır : pBas'tan sonraki veri hangisi ise onu al, pBas'a ata.


1. kez While içine girdiğimiz zaman;
pBas = p1 olduğu için, ekrana p1'in verisi olan 1 yazıldı.
pBas'a, p1'den sonraki düğüm olan p2 atandı ve pBas artık p2 olmuş oldu.


2. kez While içine girdiğimiz zaman;
pBas artık p2 olduğu için p2'nin verisi olan 4 ekrana yazıldı.
pBas'a, p2'den sonraki düğüm olan p4 atandı ve pBas artık p4 olmuş oldu.
(Daha önceki yaptığımız işlemlere dikkat ederseniz eğer, p2 -> pSonraki = p4 yapmıştık. O yüzden p2'den sonra p4 geldi. Rakamsal sıraya göre gitmiyoruz. Düğümleri bağladığımız sıraya göre ilerliyoruz.)


3. kez While içine girdiğimiz zaman;
pBas artık p4 olduğu için p4'nin verisi olan 5 ekrana yazıldı.
pBas'a, p2'den sonraki düğüm olan p3 atandı ve pBas artık p3 olmuş oldu.

4. kez While içine girdiğimiz zaman;
pBas artık p3 olduğu için p3'nin verisi olan 3 ekrana yazıldı.
pBas'a, p3'den sonraki düğümü atamayamıyoruz çünkü p3 listemizin son düğümüydü. Kendisinden sonra başka bir düğüm yok. Eğer hatırlarsanız, p3'ün adres kısmına herhangi bir düğümün verisinin adresini yazamadığımız için NULL yazmıştık. Bu sebeple pBas = NULL olmuş oldu.

pBas == NULL olduğu için ise, döngüye bir daha girmiyor program ve işlemimiz burada sonlanıyor.

----------------------------------------------------------------------------------------------------------------------

Listeye düğüm ekleme
Listeden düğüm silme
Araya düğüm ekleme
Aradan düğüm silme

işlemlerini ileriki zamanlarda başka bir konu başlığı altında, bu konun devamı olarak anlatmaya çalışacağım.

Benim anlatacaklarım şimdilik bu kadar. Umarım yeterince açıklayıcı ve faydalı olabilmişimdir. Eğer anlamadığınız yerler olursa aşağı yorum olarak bildirin. İnsalık halidir, yanlış yaptığım yerler olabilme ihtimali de vardır. Bu sebeple aklınıza takılan soruları hemen alt kısımdan yorum olarak bana iletebilirsiniz. Elimden geldiğince yardımcı olmaya çalışacağım.

Yazının devamını oku

Büyük usta ve son zamanların en büyük dehalarından, aynı zamanda da Apple'ın kurucusu Steve Jobs'un da dediği gibi :

"Bu ülkede herkesin bilgisayar programlamayı öğrenmesi gerek. Çünkü insana düşünmeyi öğretir."

Çok da doğru demiş. Günümüzde aklımızın alamayacağı ve bizi hayretler içesinden bırakan bir çok şey aslında bilgisayar programlama dilleri sayesinde yapılmaktadır. Hatta Valve'nin kurucusu Gabe, programlama bilenleri geleceğin sihirbazları olarak tanımlamaktadır ama; bu yazıdaki amacım bilgisayar programlama ile neler yapılabileceği değil, insana kişisel olarak kazandırdıklarından bahsetmek istiyorum.

Bilgisayar programlama ilerde mesleğiniz olmayacaksa bile boş zamanlarınızda uğraşılması gereken bir hobiniz olabilir. Çünkü bilgisayar programlama, stratejik ve daha geniş düşünmenizi sağlamaktadır. Adeta satranç oynar gibi. Beyninizi yorar, daha çok beyin gücü gerektiriri. Bazen sınırlarınızı aşmanız gerekir.

Günümüzde hemen hemen tüm mühendislik dallarında bilgisayar programlama öğretilmesinin sebebi de budur zaten. Bilgisayar programlamayı bilmek aslında "Bilgisayar Mühendisleri"nin işidir fakat; günümüzde makine, elektrik-elektronik, inşaat, elektronik ve haberleşme mühendislikleri ve aklıma gelmeyen daha bir çok mühendislikte herhangi bir programlama dili yarım veya tam dönem öğretilmektedir.

Programlama dilini bilmeleri iş hayatlarında hiçbir zaman işe yaramayacak olan İnşaat mühendislerinin veya makine mühendislerine veya diğer mühendisliklere öğretilmesindeki asıl amaç da bu zaten : Düşünmeyi öğretmek. Düşünmeyi öreğtmekten kastım, daha geniş, daha stratejik, daha verimli düşünmeyi öğrencilere öğretmektir.

Bunların dışında, öğrencilerin bakış açısını geliştirmek, olaylara daha farklı boyutlardan bakabilmek ve ayrıca karşılaşacağınız problemlere en kestirme ve en akıllıca yolu bulabilmeyi öğretir. Mesela programlama dili öğrenirken öğreneceğiniz algoritma sayesinde çok karmaşık problemleri daha basite indirebilme ve her açıdan olasıkları değerlendirerek en akıllıca çözüme ulaşma gibi insana gerçek hayatta bir çok katkı sağlamaktadır. Bunun için hangi programlama dilinn öğrendiğinizin pek bir önemi yoktur.

Kendi alanınızla ilgili olmasa bile eğer hoşunuza gider ve kendizi iyice geliştirdikten sonra bu işten para kazanmak isterseniz; ister kendi uygulama ve programlarınızı yapıp satabilir, İsterseniz de hem yurt içi hem de yurt dışında rahatlıkla iş imkanı bulabilirsiniz...

Teknolojinin çok hızlı bir şekilde gelişmesiyle birlikte günümüzde Amerika işe almak için, programlama bilen 1 milyon kişi arıyor. Hatta bunun için başta Microsoft'un sahibi Bill Gates, Facebook'un sahibi Mark Zuckerberg ile Facebook'ta çalışan önemli bilgisayar mühendisleri, Twitter'ın sahibi Jack Dorsey, Drobbox'un sahibi Drew Houston ve diğer ün yapmış ve işinde başarılar elde etmiş önemli kişilerin, Amerika'da programlama öğrenme yaşını düşürerek, gençlere daha erken yaşta  programlama öğrenmeye teşvik etmek için ortaklaşa bir proje başlatmışlar.

Bu projenin videosunu alt yazılı olarak alt kısma ekledim. Videoyu baştan sona kadar izlemenizi tavsiye ederim. Bilgisayar programlamanın neden öğrenilmesi gerektiğini kısmen de olsa anlatan fakat daha çok programlama öğrenmeye teşvik eden bir bir video olmuş diyebilirim. Ayrıca çalışma alanlarının ne kadar eğlenceli yerler olduğundan da bahsetmeyi ihmal etmemişler.

Yazının devamını oku
BLOGKAFEM.NET © Copyright 2008-2026
Sitedeki yazıların her hakkı BLOGKAFEM.NET sitesine aittir.
Kopyalanması halinde lütfen kaynak gösteriniz.
DMCA.com Protection Status
Anasayfa | Hakkında | İletişim