29-04-2008, 14:11
Merhabalar;
Aşağıda göreceğiniz Algoritma, yazılım ve veritabanı kavramı hakkındaki makaleler, büyük üstat Türkay ÜRKMEZ'DEN alıntıdır.. Kendisinin sitesine de uğramanızı tavsiye derim..
http://www.turkayurkmez.com/
Programcılık ? yani yazılım ? olaya dışarıdan bakan birçok kişi için asosyal bir meslek gibi gözükmesine rağmen aslına bakarsanız; programcılığın, kod yazmanın bir aşk olduğunu görürsünüz. Ve bu aşkın en büyük sebebi ise, o yazılan programın iskeletini oluşturan algoritmadır.
Peki ama nedir bu algoritma ? Bu kadar övülmeye değer mi gerçekten ? Neden bir aşk gibi heyecan verici ve eğlencelidir? Ve en önemlisi neden bu kadar önemlidir ?
Sanırım çocukluğunda, Tom ve Jerry? i sevmeyen yoktur. Özellikle, Tom? un Jerry? i yakalamak için kurduğu, şu ciddi zeka gerektiren tuzakları herkes hatırlar.
Örneğin; Tom, bilardo ıslakası ile, bilardo topuna vurarak düzeneği başlatır. Top yuvarlanarak masanın sonunda, kaldıraç işlevini gören bir tahtaya çarparak düşürür. Tam tahtanın düşmesiyle birlikte bir bowling topu yuvarlanmaya başlar ve tam hızla bir davula çarpar. Davuldan gelen ses titreşimleri, birkaç bir şeyi tetikler ve sonunda bir ağ jerry? nin üzerine düşmek üzere serbest kalır. Gerçi çoğu zaman Jerry kurtulur. Ama bu konumuzun dışında J
Böyle bir düzeneğin çalışmasını izlemek oldukça eğlencelidir. Peki böyle bir düzeneği inşa etmek ? Eğer bunun da çok eğlenceli olacağını düşünüyorsanız, emin olun iyi bir programcı olabilirsiniz demektir. Çünkü iyi bir program, hedefe ulaşmak için tasarlanmış sağlam bir algoritma üzerine kurulmuştur.
Algoritma kavramını irdelemek için, biraz kafamızı bilgisayarların ve sanal hayatın dışına uzatıp, evrenin ve hayatın kendisine bakalım. Tamam, belki bir algoritma fanatiği olarak iddialı bir cümle olacak ama şunu rahatlıkla söyleyebilirim ki; ?Hayat ve Doğa?da bile algoritma vardır.?
Evet.. Bilinen en klasik felsefeye göre hayat bir neden ? sonuç bütünüdür. İnanmazsanız gelin Şişman Adam?ın (ki o ben oluyorum) her sabah tekrar eden algoritmik yaşamına bir bakın:
Saat 07.30 Saat çalar.. Şişman Adam uyanır ve ?beş Dakka daha uyuyayım? diyerek mırıldanır. Genellikle yirmi dakika uyur ve aniden yataktan fırlar çünkü işe geç kalmak üzeredir. Hemen mutfağa koşar kendine bir şeyler hazırlar ve kahvaltı yapmaya başlar.. Yer,yer, yer, yer doymuş mudur ? HAYIR ! Yine yer, yer, yer, doymuş mudur ? Yine hayır... Tam o sırada beyni, ?işe geç kaldığını? söyler ve maalesef doymadan kalkar. İşe gitmek üzere yola koyulur. Çıktığında üç olasılık vardır; a.) Otobüs, b) Tren, c)Dolmuş birini seçmek zorundadır. Bunun içinse saatine bakar ve şu şekilde düşünür:
Eğer saat 07.50 ise trenle gider.
Eğer saat 08.00 ise otobüs?
Eğer saat 08.05 ise dolmuş?
Çünkü; hedefi zamanında işte olmaktır.
Tüm bu söylediklerimiz üzerine algoritma kavramını bir inceleyelim..
İyi bir Algoritma ;
* Hedef
* Koşullar
* Parametreler
Olarak sayabileceğimiz öğelerden oluşan bir kavramdır. Eğer bu öğeleri sorunsuz bir şekilde tamamlayıp, birleştirirseniz algoritmanızı tamamlamışsınız demektir.
Hedef, zaten belirli bir ihtiyaç analizi süreci sonrasında oluşturacağınız bir kavram, Diğer iki öğe ise bu hedefin nasıl, ne şekilde gerçekleşeceği üzerine yoğunlaşır.
Bana kalırsa, bu noktada en önemli öğe, ?koşul? öğesidir. Hedefine kilitlenmiş bir algoritmanın temelinde, koşul kavramı yatmaktadır. Hatta işin en eğlenceli kısmıdır diyebilirim. Şişman Adam?ın algoritmasında, tüm koşullar ?işe zamanında gitmek? hedefi üzerine şekilleniyor. O nedenle; uykusunu alamasa da, kahvaltıda karnını doyuramasa da hedefini gerçekleştirmek üzere, tek bir parametre yani saatin kaç olduğuna bakarak hareketine karar veriyor?
İşte bir bilgisayar programının çalışma algoritması da böyledir. Söz yine programa gelmişken şunu söyleyebiliriz?
Eğer program bir canlı olarak düşünülürse, programcı onun ebeveynidir. Büyüyünce ne olacağını (hedefi), hayata dair bilgileri (parametreleri) ve onları nasıl kullanacağını (koşullar) ona ebeveyni öğretir.
Eh.. Artık onun neden bir aşk olduğunu ve önemli bir aşk olduğunu sanırım daha net anlamışsınızdır. Bu yazı da size keyifli gelmişse, mutlaka bir programlama dilini öğrenmeye başlayın derim. İyi çalışmalar.
Daha önceki makalemizde belirttiğimiz gibi, programcılık, hayatın kendisidir. Bu nedenle, Şişman Adam üzerinden kavramları incelemeye devam edeceğiz.
Şişman adam; hareketlerine, yapacağı işlere nasıl karar verir ? Mutlaka ve mutlaka, herkes de olduğu gibi onun da bir karar mekanizması var ve bu mekanizma temel olarak neden ? sonuç ilişkisine dayanır. Bu ilişkideki ?nedensellik? ise en temelde var ? yok ya da evet ? hayır değerleri taşır. Efendim ? Elektronikteki gibi mi dediniz ?
Daha ötesine bakın lütfen... İnsanlardaki gibi desek çok mu abartmış oluruz ? Şu sözü, bir elektronik aygıt mı söyledi yoksa; ?Olmak ya da olmamak...? ? Evet insan düşüncesi de bu temel ilke ile karar veriyor: Herhangi bir eylemin gerçekleşip gerçekleşmediğine bakmak... Programcılıktaki adıyla; ?True? ya da ?False? olup olmadığına...
Şişman Adam?ın, bu konudaki örneklerine bir bakalım isterseniz...
Adamımız; günlerden birgün, yalnızlığa canının tak ettiğini düşünür ve biraz rahatlamak için (!) Bara gider. Barda meyve suyunu yudumlarken karşısındaki bayandan etkilendiğini hisseder. O anda ? farketmese de ? beyni şu şekilde düşünür:
EĞER karşıdaki bayan sana bakıyorsa
Git onunla konuş.
DEĞİLSE
Kısmet değilmiş.
KARAR VERİLDİ
Bu yapıyı VB.NET?e çevirirsek:
IF bayanbakıyormu = true THEN
MessageBox.Show("Git Konuş")
ELSE
MessageBox.Show("Kısmet Değilmiş")
END IF
İşte sevgili yazılım dostları, tüm yazılım dilleri için bel kemiği olan ?Karar yapıları? na temel bir giriş yaptık. Ancak tabii ki olay bu kadar değil. Olayı çok da uzatmadan Şişman Adam?a geri dönelim.
Şişman Adam?ın ayda bir kere psikolog bir arkadaşına gidip danışma gibi bir özelliği var. Şimdi size bu son görüşmeden kısa bir konuşmayı aktaralım.
?Her şey dokuz yaşımdayken başladı dostum... Kahvedeki o yaşlı amca beni o kadar yıpratmıştı ki, hala hatırladıkça tüylerim diken diken oluyor:
O gün, mahallede arkadaşlarımla oyun oynuyorduk. Birden kahvenin önünde oturan yaşlı bir adam yanıma geldi ve elinde tuttuğu boş Uzun Samsun paketini bana göstererek şu aşağıdaki cümleyi kurdu:
EĞER bu sigara varsa
Bu sigaradan al
YOKSA EĞER Kısa Samsun varsa
Onu Al
YOKSA EĞER Uzun Maltepe varsa
Onu Al
YOKSA EĞER Kısa Maltepe varsa
Onu Al
O KADAR
Bu cümleyi unutamadım dostum....?
Evet Şişman Adam?ın bu garip anısının tabii ki, VB.NET ile bir bağlantısı var. Yukarıdaki cümlenin aynısını bakın VB.NET dilinde nasıl yazıyoruz:
IF uzunsamsunvarmi = true THEN
Messagebox.Show(?Uzun Samsun Al?)
ELSE IF kisasamsunvarmi = true THEN
Messagebox.Show(?Kısa Samsun Al?)
ELSE IF uzunmaltepevarmi = true THEN
Messagebox.Show(?Uzun Maltepe Al?)
ELSE IF kisamaltepevarmi = true THEN
Messagebox.Show(?Kısa Maltepe Al?)
END IF
Sanırım farketmişsinizdir, şimdiye kadar karar yapılarını sadece bir eylemin sonucuna göre kullandık. Oysa ki, normal bir insan çoğu zaman, karar verirken birbirinden farklı birkaç eylemin sonucuna bakmaktadır...
Örneğin Şişman Adam, ÖSS?de barajı geçip de, sıra tercih aşamasına geldiğinde şöyle düşünmüştü:
?EGER puanım bu bölüme yetiyorsa VE bu bölümde okumak beni mutlu edecekse
Yazarım....
KARAR VERİLDİ.
Ya da daha spesifik bir örneği Şişman Adam?ın anılarından aktaralım:
Şişman Adam, katıldığı bir nikah töreninde şöyle bir gözlem yapmış:
Damat ve Gelin, nikah memurunun huzuruna çıktıkları anda, hayatları boyunca unutamayacakları en güzel ?evet? i diyeceklerini biliyorlardı. Ve yine bildikleri birşey vardı ki; içlerinden birinin ?hayır? demesi durumunda, bu evlilik gerçekleşmeyecekti.
Yani bir cümleyle şöyle özetlenebilir bu durum:
EĞER Damat ?evet? der VE Gelin de ?evet? derse
Evlenirler.
DEĞİLSE (İçlerinden biri hayır derse)
Evlenemezler
BUDUR.
İşte bu cümlede VB.NET? de kullanılan AND operatörünü anlamamıza olanak sağlayacaktır.
IF Damat = ?Evet? AND Gelin = ?Evet? THEN
MessageBox.Show(?Evlenirler?)
ELSE
MessageBox.Show(?Evlenemezler?)
END IF
Normal hayattaki kararlara geri dönelim...
Zaman zaman, öyle durumlar oluşur ki; karar vermeniz için iki eylemden birinin gerçekleşmesi yeterli olur. İşte bu durumda da VB.NET tarafında ?VEYA? anlamına gelen OR kullanırız...
IF Gun = ?Cumartesi? OR Gun = ?Pazar? THEN
MessageBox.Show(?Hafta Sonu?)
ELSE
MessageBox.Show(?Hafta İçi?)
END IF
Peki... her eylemin bir sonucu mu vardır şu hayatta ? Hayır tabii ki... Bazen, eylemin gerçekleşme şekline göre birden fazla sonuca kendinizi hazırlayıp ona göre karar vermeniz gerekir.
Bunun örneğini bakalım Şişman Adam nasıl veriyor...
Şişman Adam, paranoyak bir adam olduğu için, araba kullanırken ışıklara gelmeden neredeyse bir kilometre önceden aşağıdaki gibi düşünür...
Işıklara Ulaştığında
Işık Kırmızı ise
Duracak
Işık Sarı ise
Bekleyecek
Işık Yeşil ise
Geçecek
Bitti
İşte sevgili Şişman Adam fanatikleri...
Bu tarz bir karar mekanizmasını VB.NET ?de select case yapısını kullanarak yapıyoruz
SELECT CASE isiklar
Case is ?Kırmızı?
MessageBox.Show(?Dur?)
Case is ?Sarı?
MessageBox.Show(?Bekle?)
Case is ?Yeşil?
MessageBox.Show(?Geç?)
END SELECT
Gördüğünüz gibi dostlar... Programcılığı hayatın temellerinden ayıramayacağınızı bir kez daha gösterdik.
Şunu asla unutma ey sevgili okur... Burada olduğunuz sürece şişman adam maceralarına devam edecek.
Hepinize sağlam algoritmalı kodlar diliyorum...
Hayatın tüm anlarının, yazılımda bir karşılığı olduğunu artık anladınız biliyorum... Ama, durmayacak bu şişman adam ! Koşacak ve zayıflamayacak ! : )
Şimdi sevgili dostlar... Üçüncü makalemizde, şişman adamımız bizi döngülerin içine atıyor. Bakalım neler olacak...
Öncelikle, döngünün ne anlama geldiği hakkında biraz beyin fırtınası yaşayalım. Çoğu aksiyon filminde klişeleşmiş bir replik vardır : ?Zamanı geldiğinde harekete geçeceğiz.. Saatlerimizi ayarlayalım.? Bu repliği söyleyen arkadaş, koşul olarak kendisine zamanı seçiyor ve bu koşul gerçekleştiği an, eyleme geçiyor..
Biz yine buradaki ?koşul? kavramının felsefesine bir inelim. İnsan, her türlü hareketine ? yaşamının devam etmesi için zorunlu olanlar da dahil ? koşullar aracılığı ile karar verir. Zaman da, insanların icad ettiği koşullardan biridir bu durumda...
Peki.. Beklenen koşul gerçekleşmediğinde ne yapar ? Buna verilecek en temel yanıt, ?koşulun gerçekleşmesini bekler? olacaktır öyle değil mi ? Koşul gerçekleştiği anda ise, zafer onun olacak ve eylemine başlayacaktır. İşte tüm bu sürece biz, programcılıkta ?döngü? adını veriyoruz..
Bu kadar felsefi giriş yeter, Şişman Adam?a dönelim.. Bakalım o bize bunu nasıl anlatacak ?
Bizim Şişman Adam, bir zamanlar bir bankada yöneticilik yapıyordu. Kahramanımız, pek de otoriter biri sayılmaz ama, stratejist biri olduğu rahatlıkla söylenebilir. Günlerden birgün, mesai saatinin bitiminden yaklaşık bir saat önce, acilen bir yere gitmesi gerekir.
Bankadan çıkmadan önce, yaklaşık elli kişilik bir kuyruğun, bir banka memurunun önünde biriktiğini görür. Memurun yanına giderek şöyle der :
İşin bitmesi İÇİN Birinci kişiden başla, ellinci kişiye kadar birer birer git
Bir kişinin işini hallet
Sıradakini çağır.
Memur bu durumdan ne kadar memnun bilmiyorum ama yukarıdaki cümle sanki bir For Next döngüsünü çağrıştırıyor:
FOR kisi as integer = 1 to 50 Step 1
MessageBox.Show (kisi & ?. Kişinin işi yapıldı?)
NEXT
Bakın bir For...Next döngüsü için en temel parametreler karşımıza çıktı. Bunlar;
* Başlangıç Noktası
* Bitiş Noktası
* Başlangıç?tan Bitiş?e hangi adımlarla gideceği...
Buradaki, örnek lütfen sizi yanıltmasın... Örnekte; başlangıç noktası minimum, bitiş noktası maksimum (1 to 50) artış değeri ise 1 (step 1) olarak belirtiliyor. Ancak bu bir zorunluluk deği. Yani maksimumdan minimuma da For..Next döngüsü kurmak mümkün. Fakat bu durumda STEP -1 olarak verilmelidir.
FOR kisi as integer = 50 to 1 Step -1
MessageBox.Show (kisi & ?. Kişinin işi yapıldı?)
NEXT
Bakınız sevgili dostlar, For...Next döngüsü çalışırken üç tane zorunlu parametre sahibiyiz. Ancak, hayatımızdaki koşulların gerçekleşme süreçleri (döngüler) her zaman böyle spesifik parametrlerden oluşmazlar. Her ne kadar yurdum insanı, sorulan adrese hep ?100 metre ilerde solda? dese de, genelde spesifik bir değerden (50 kişi gibi) bir çırpıda bahsetmemiz pek olası değildir. Tabii Yağmur Adam gibi değilseniz...
Durum böyle olunca işin içine, spesifik parametre içermeyen; yalnızca, koşulun gerçekleşip gerçekleşmeme durumuna göre hareket eden bir döngü mekanizmasına ihtiyaç duyulur...
Ya tamam biliyorum biliyorum çok resmi gidiyor bu yazı... Hani şimdi Şişman Adam fanatikleri hafiften ?kısa kes beaaa, ben şişman adamı arıyorum? diyor olabilir. Tamam canım hemen sözü bizim Şişman Adam?a bırakıyorum...
Şişman Adam, akşamları eve trenle dönmeyi tercih ediyor genelde. Söğütlüçeşme tren istasyonundan bindiği banliyö treninden Atalar istasyonunda iniyor ve ulaşımında tren ya da otobüs kullanan çoğu insan gibi arada kaç tane istasyon olduğunu hiç bilmiyor.
Yani şişman adamın bilinci, trene bindikten sonra şöyle işliyor:
? Trenin durduğu istasyon Atalar?dan farklı olduğu SÜRECE
Trende Kal
Tren sonraki istasyona devam etsin
?
Bu ifadede görüldüğü gibi, spesifik olan tek şey, koşulun kendisi yani, tren istasyonunun Şişman Adam?ın ineceği durak olan Atalar?dan farklı olması.
Bu durumu bakın VB.NET?e nasıl çeviriyoruz
While istasyon <> ?Atalar?
Trende Kal
Sonraki istasyona git
End While
Bu kadar basit !!!
Şimdi sevgili dostlar... Programcılık aleminin ve VB.NET? in en sağlam döngüsü olan FOR EACH döngüsünü tamamen Şişman Adam?ın tombul ellerine bırakıyorum...
Şişman Adam, yalnız yaşayan bir adam. Yo yanlış anlamayın, asosyal olduğundan falan değil, evi o kadar dağınık ki, hiç kimse onunla yaşamaya tahammül edemiyor. Tabii her kahramanda olduğu gibi, bizim şişman adamın da duygusal bir yönü var. Gel gelelim bu duygusal taraf geçen günlerde dank etti ve adamımız bundan sonra temiz bir adam olacağına söz verdi.
Hemen evi temizlemek için bir algoritma düşündü... Düşündü... Ve aşağıdaki cümleyi kurdu :
Odanın içindeki herbir eşya için
Eşyanın tozunu al.
Sıradaki eşyaya geç.
Sonra da bunu günlüğüne aşağıdaki gibi geçirdi:
For Each esya in oda
MessageBox.Show (esya & ??nın tozu alındı?)
Next
Mükemmel bir döngü ! Kral bir döngü !!!
Sevgili algoritma aşıkları ! Döngülerde sık karşılaşılan bir mantıksal hataya karşı hepinizi uyarmak Şişman Adam?ın boynunun borcudur. Bu mantıksal hatanın adı : ?Sınırsız Döngü? dür. Ve yazılımcılar arasında, ?sınırsız döngülere giresice? diye bir takılma bile söz konusudur.
Makalenin başında belirttiğimiz döngü tanımına gönderme yaparak diyebiliriz ki; ?gerçekleşmesi mümkün olmayan bir koşula yönelik oluşturulan döngü, sınırsız döngüdür.?
Nasıl yani ? Şöyle yani... ?Kırmızı kar yağdığında, seninle evleneceğim? derseniz birine, yüzünüze tokadı yiyeceğiniz aşikardır. Çünkü, bu bir sınırsız döngüdür.
Örneğin For...Next döngüsünde anlatılan ikinci örneği sınırsız döngüye sokalım:
FOR kisi as integer = 50 to 1 Step 1
MessageBox.Show (kisi & ?. Kişinin işi yapıldı?)
NEXT
Dikkat !! 50?den başlan kisi degiskeni, 1?er 1?er ARTARAK 1? ulaşmaya çalışıyor ! 30 Şubat?da buluşuruz demek gibi birşey bu !!
Amman dikkat derim !
Evet sevgili dostlar... Şişman adam, bu maceranın da sonuna bu şekilde geldi. Bir sonraki makalede görüşmek üzere...
Şişman Adam?ın bir yenisi gelene kadar sınırsız döngüye girmemeniz temennisiyle...
Sevgili dostlarım; eğer bu maceraların takipçisiyseniz; yazılımın, hayatın tam içinden olduğunu biliyorsunuz demektir ve eğer bunun bilincindeyseniz; benden de böyle bir yazım tarzı bekliyorsunuz demektir?
Ama söz konusu Veritabanı olunca?
Ya? Heyecanlanmayın tamam? Şaka yaptım sadece ?Ama? sı falan yok? Veri tabanı da, hayatımızın içinden bir kavram?
Şöyle düşünün arkadaşlar (bu tarzı yemin ederim çok özlemişim.) Günlük hayatımızda, doğumumuzdan ölüme kadar olan süreç içersinde tüm yaşamsal ihtiyaçlarımızı karşılamamızda yardımcı olan en önemli şey nedir sizce? Hadi canım dürüst olun! ?Para? dır. Öyle değil mi?
Peki sizler günlük hayatınızda bu paraya sürekli ulaşabilmeniz, üzerinde işlem yapabilmeniz ve paranın güvenliğini sağlamak için ne yaparsınız? Sıralayalım:
* Anneme veririm, annemden alırım.
* Yastığımın içine koyarım.
* Testiye koyup bahçeme gömerim
* Bankaya yatırırım ve böylece internet, telefon gibi iletişim cihazlarını kullanarak parama istediğim zaman erişir, üzerinde işlem yapabilirim. Hem de güvenli olur.
Buradaki durumda; ?en hızlı ve güvenilir? olanı seçersek; bu seçenek hiç şüphesiz ki; ?Banka? olacaktır.
İşte sevgili dostlarım; günlük hayatımızdaki paranın yerini, yazılım hayatında ?veri? almaktadır. Bankanın yerini ise Veritabanı?
O zaman Yukarıda yer alan son maddeyi buna göre tekrarlayalım
?Veritabanını kullanarak verime istediğim zaman erişir, üzerinde işlem yapabilirim. Hem de güvenli olur? (yo hayır tabii ki copy-paste yapmadım ellerimle yazdım).
Arkadaşlar, üzerinde önemle duruyorum ki, veritabanına kavramına hakim olmak ve ona hak ettiği ehemmiyeti vermek çok önemli. Lütfen ve lütfen veri tabanı bilmeden yazılım konusunda çok fazla yol kat edilemeyeceğinin bilincinde olalım?
Bu benden beklenmeyen ciddi uyarıdan sonra, hayattaki örneklerimize geri dönelim?
Dostlarım; mademki, veriyi para ile bir tutuyoruz, bu yoldan hareketle şunu söyleyebiliriz, önemli olan parayı BİRİKTİRMEK değil YÖNETMEK? tir. Yoksa efenim enflasyonu var, devalüasyonu var? Risk yönetimini ciddiye almak lazım.
Yatırım yönetimi konusunda tecrübeli insanlardan öğrendiğim kadarıyla; paranın birbiriyle ilişkili olacak şekilde birden farklı yatırım kanallarına bölünerek değerlendirilmesi çok daha iyiymiş. Ama burada önemli olan kriter, yatırım kanallarının çok olması DEĞİL, ilişkilerinin sağlıklı olmasıymış?
Devam etmek isterim ama, konumuz SQL değil mi? Mademki veri eşittir para, o zaman acaba yatırımcı ağabeylerin / ablaların sözlerini veritabanında da kullanabilir miyiz ?
Evet, aslında sevgili dostlarım iki paragraf önce, ilişkisel veritabanı yönetimi sistemi ? Relational DataBase Management System (RDBMS) kavramına girmiş oldunuz. Yazılım dünyasına hayırlı ve uğurlu olsun.
Evet arkadaşlar, veritabanındaki yatırım araçlarımız ise tablolarımızdır. Tablolar arası kurulan ilişkiler aracılığıyla; verinize güvenilir ve hızlı erişir ve aynı oranda güncelleyebilirsiniz? İşte bu, verileri tablolara bölme ve tabloları birbiriyle ilişkilendirme yöntemlerine de normalizasyon adı verilir.
Dostlarım, tecrübeli yatırımcılar nasıl tecrübelerini diğer yatırımcılara aktarıyorlarsa, RDBMS kavramına yılların emeğini vermiş insanlar da bizlere öyle aktarıyorlar modelleme yöntemlerini? Normalizasyon kavramı da aslında bu tarz önerilerin bir manifestosudur. Söz gelimi; Excel?de oluşturulmuş bir belge de veri tabanı olarak düşünülebilir ancak ?hmm bak böyle yaparsan daha iyi olur? der bize normalizasyon?
Bir veritabanının normalizasyonunu oluştururken başlangıç olarak ?amaçladığınız sonuç? a karar vermelisiniz dostlar. Yani elinizdeki verinin olabilecek en detaylı çıktısını örnekleyerek yola çıkarsınız.
Hadi eğlence başlasın o zaman
Senaryomuz bir telefonla pazarlama şirketi üzerinden olsun. Bu şirketin, nasıl çalıştığını kaba taslak bir çizelim önce?
Şirketimiz birkaç kategoriden oluşan ve birkaç farklı tedarikçinin sağladığı ürünleri, kayıtlı müşterilerine ulaştırmaktadır. Satılan ürünler, anlaşmalı kargo şirketleri tarafından müşterilere ulaştırılmaktadır. Bu arada, şirketin çalışanları sattıkları ürünlere belli oranlarda prim alırlar. Bu durumda söz konusu şirket için sipariş verilerinin tutulması çok büyük önem taşımaktadır.
Bu paragraf, bazı şeylerin kafamızda canlanması için yeterli sanırım. Bakınız bazı kelimelerin üzerinden geçelim ve daha dikkatli olalım
* birkaç kategoriden oluşan
* farklı tedarikçinin sağladığı
* ürünleri
* kayıtlı müşterilerine
* anlaşmalı kargo şirketleri
* çalışanları
* sipariş
(Bu sefer copy ? paste yaptım. İtiraf ediyorum).
İstediğimiz en detaylı veri çıktısı ise aşağıdaki gibi olsun:
Sipariş No.........1
Müşteri Adı....... Ayhan Çalışkan
SiparişTarihi...... 07.01.2007
Gönd.Gereken T. 14.01.2007
Kargo Tarihi...... 10.01.2007
Kargo Ücreti..... 100 YTL
Alınan Ürün...... Plazma TV
Ürün Kategorisi. Elektronik
Ürün Adedi 1
Sipariş Toplam 2500 YTL
Şimdi? Biraz kendimizi zorlayalım ve bazı sorular soralım:
1. Böyle bir veriyi en hızlı ve en güvenli şekilde nasıl elde ederim
2. Bu veriden daha farklı olarak nasıl veriler üretilebilir ?
İkinci sorumuzdan başlayalım.
* Çalışanlar satışları üzerinden prim aldıklarına göre, hangi çalışanın ne kadar ürün sattığı bilinmek istenecektir.
* Hangi müşterinin belirli bir dönemde ne kadar ürün aldığı görülmek istenebilir.
* Bir tarih verilip, o tarihteki siparişler görülmek istenebilir.
* Kargo şirketlerinin durum takibi istenebilir
* En çok hangi ürünün satıldığı / kar ettirdiği bilinmek istenebilir.
* En çok kazandıran sipariş görülmek istenebilir
Ve daha fazlası.. Bu patronlar hep böyle canım isterler de isterler? Şimdi biz, bu veritabanının nasıl normalize edileceğine bakalım?.
Bir an için, bilgisayar diye bir şeyin icat edilmediğini var sayalım. Ama yine de, yukarıdaki raporları isteyen bir patron mutlaka olurdu herhalde !! (Ey sevgili patronum eğer bu yazıyı okuyorsan seni tenzih ederim? Sözüm meclisten dışarı
Şimdi madem bilgisayar yok, o zaman raporları hazırlamanız için kendinize bir ekip kurardınız di mi? Peki Bu ekibin görev dağılımı en verimli nasıl olabilirdi ?
Verimlilik derken şunu kastediyorum, ekibinizdeki tüm kişilerin performansı yüksek olmalıdır ki; istediğiniz raporu hızlıca hazırlayabilsinler. Çok sıkılıp bunalmasınlar. Her veriyi nerede bulabileceklerini çok iyi bilsinler. Yani o konuda uzman olsunlar.
Demek ki, ekipteki her kişiye uzman olması gereken bir konu vereceğim;
Örneğin;
* Mehmet bey; siz yalnızca çalışanların bilgilerinden sorumlusunuz. Her bir çalışanın, adı, soyadı, iletişim bilgileri, doğum tarihi sizden sorulacak
* Aykut bey; siz ise Kargo şirketlerinden sorumlusunuz efenim
* Emre bey, siz Kayıtlı Müşterilerden sorumlusunuz. Şirketin müşteri portföyündeki tüm bilgileri ne var ne yok bilmenizi istiyorum
* Cihan bey aramızdaki en tecrübeli sizsiniz bu nedenle Sipariş bilgilerini de size emanet ediyorum?Hangi siparişimiz hangi müşterimiz tarafından alınmış.. Hangi çalışan satmış, sipariş tarihleri falan sizden sorumludur efendim
* İlhan bey, siz siparişlerin bazı detaylarından sorumlusunuz. Örneğin hangi siparişte hangi üründen kaç adet var ? indirim felan yapılmış mı bu görev sizin?
* Derya hanım, siz ürün bilgilerinden sorumlusunuz?
* Ayhancım dostum, sen kategorileri çok iyi bileceksin. Ona hakim olacaksın hadi göreyim seni?
* Tuğrul bey siz de, efenim lütfen tedarikçi şirketlerimiz hakkındaki tüm verilere hakim olunuz?
Şimdi değerli ekip arkadaşlarım beni iyi dinleyiniz. İşleri hızlandırmak için şöyle bir şey yapacağız; Şöyle ki :
1. Ayhan ve Tuğrul bey siz telefon numaralarınızı Derya hanıma veriniz.
2. Derya hanım siz de telefon numaranızı İlhan bey?e veriniz lütfen.
3. İlhan bey siz, Cihan beyin de telefon numarasını alın?
4. Emre Aykut ve Mehmet bey sizlerde telefon numaralarınızı Cihan beye veriniz lütfen?
Bakın arkadaşlar bu sayede şöyle bir sistem kurmuş olduk;
Şimdi niye böyle bir şey yaptık? Şöyle düşünün yazılım dostları, ben Derya hanım?a, Ürünlerin hangi kategorilere ait olduklarını ve bu ürünleri kimden tedarik ettiğimizi sorarsam; Derya hanım hemen Ayhan bey?i arayarak ürünlerin kategorilerini soracak. Bilgileri aldıktan sonra da, Tuğrul beyi arayıp, tedarikçilerin isimlerini alacak. Yani, bu bilgiler, Derya hanım?da toplanacak ve istediğim rapor hazırlanmış olacak. Di mi ? Peki yukarıdaki ?en detaylı veri çıktısı? nı istersem?
O zaman;
1. Cihan Bey, Mehmet Bey?i arayarak, Çalışan ismini sorar
2. Cihan Bey, Emre Bey?i arayarak, Müşteri ismini sorar
3. Cihan Bey, Aykut Bey?i arayarak siparişi götüren kargo şirketini sorar
4. Cihan Bey, İlhan Bey?i arayarak hangi ürünün sipariş edildiğini sorar
5. İlhan bey bunu bilmediğinden, Derya hanımı arar ve ürün adını öğrenir
6. Derya hanım kategorisini öğrenmek için Ayhan bey?i arar
Ve ben raporumu yine elde ederim !!!!
Ya sevgili dostlar tahmin ettiğiniz gibi yukarıdaki senaryoda, ekibimde bulunan insanlar aslında birer tablo. Ve tablolar birbirlerine ilişkiler ile bağlı?
Bakın bir kavram daha görmüş oluyorsunuz böylece?.
PrimaryKey?ler ve ForeignKey?ler? Bunu şöyle açıklayalım?
Tuğrul bey?in cep telefonu numarası kendisinin PrimaryKey?idir?
Derya hanımın cep telefonundaki rehberde yer alan Tuğrul Bey?in numarası ise ForeignKey?dir?
Derya Hanım bu ForeignKey?i kullanarak Tuğrulbey?e ulaşır?
İŞTE VERİM DİYE BEN BUNA DERİM
Süper oldu ama di mi ? Ben yöneticilik mi yapsam ne ?
Evet sevgili yazılımseverler? Bu makalemde, normalizasyon kavramını naçizane Şişman Adam tarzında anlatmaya çalıştım sürç-i lisan ettiysek affola?
Umarım hoşunuza gitmiş ve veritabanı kavramının mantığını anlamışsınızdır?
Not: Bu makaleler sayın Türkay Ürkmez den izin alınarak sitemizde yayımlanmıştır.
Aşağıda göreceğiniz Algoritma, yazılım ve veritabanı kavramı hakkındaki makaleler, büyük üstat Türkay ÜRKMEZ'DEN alıntıdır.. Kendisinin sitesine de uğramanızı tavsiye derim..
http://www.turkayurkmez.com/
Programcılık ? yani yazılım ? olaya dışarıdan bakan birçok kişi için asosyal bir meslek gibi gözükmesine rağmen aslına bakarsanız; programcılığın, kod yazmanın bir aşk olduğunu görürsünüz. Ve bu aşkın en büyük sebebi ise, o yazılan programın iskeletini oluşturan algoritmadır.
Peki ama nedir bu algoritma ? Bu kadar övülmeye değer mi gerçekten ? Neden bir aşk gibi heyecan verici ve eğlencelidir? Ve en önemlisi neden bu kadar önemlidir ?
Sanırım çocukluğunda, Tom ve Jerry? i sevmeyen yoktur. Özellikle, Tom? un Jerry? i yakalamak için kurduğu, şu ciddi zeka gerektiren tuzakları herkes hatırlar.
Örneğin; Tom, bilardo ıslakası ile, bilardo topuna vurarak düzeneği başlatır. Top yuvarlanarak masanın sonunda, kaldıraç işlevini gören bir tahtaya çarparak düşürür. Tam tahtanın düşmesiyle birlikte bir bowling topu yuvarlanmaya başlar ve tam hızla bir davula çarpar. Davuldan gelen ses titreşimleri, birkaç bir şeyi tetikler ve sonunda bir ağ jerry? nin üzerine düşmek üzere serbest kalır. Gerçi çoğu zaman Jerry kurtulur. Ama bu konumuzun dışında J
Böyle bir düzeneğin çalışmasını izlemek oldukça eğlencelidir. Peki böyle bir düzeneği inşa etmek ? Eğer bunun da çok eğlenceli olacağını düşünüyorsanız, emin olun iyi bir programcı olabilirsiniz demektir. Çünkü iyi bir program, hedefe ulaşmak için tasarlanmış sağlam bir algoritma üzerine kurulmuştur.
Algoritma kavramını irdelemek için, biraz kafamızı bilgisayarların ve sanal hayatın dışına uzatıp, evrenin ve hayatın kendisine bakalım. Tamam, belki bir algoritma fanatiği olarak iddialı bir cümle olacak ama şunu rahatlıkla söyleyebilirim ki; ?Hayat ve Doğa?da bile algoritma vardır.?
Evet.. Bilinen en klasik felsefeye göre hayat bir neden ? sonuç bütünüdür. İnanmazsanız gelin Şişman Adam?ın (ki o ben oluyorum) her sabah tekrar eden algoritmik yaşamına bir bakın:
Saat 07.30 Saat çalar.. Şişman Adam uyanır ve ?beş Dakka daha uyuyayım? diyerek mırıldanır. Genellikle yirmi dakika uyur ve aniden yataktan fırlar çünkü işe geç kalmak üzeredir. Hemen mutfağa koşar kendine bir şeyler hazırlar ve kahvaltı yapmaya başlar.. Yer,yer, yer, yer doymuş mudur ? HAYIR ! Yine yer, yer, yer, doymuş mudur ? Yine hayır... Tam o sırada beyni, ?işe geç kaldığını? söyler ve maalesef doymadan kalkar. İşe gitmek üzere yola koyulur. Çıktığında üç olasılık vardır; a.) Otobüs, b) Tren, c)Dolmuş birini seçmek zorundadır. Bunun içinse saatine bakar ve şu şekilde düşünür:
Eğer saat 07.50 ise trenle gider.
Eğer saat 08.00 ise otobüs?
Eğer saat 08.05 ise dolmuş?
Çünkü; hedefi zamanında işte olmaktır.
Tüm bu söylediklerimiz üzerine algoritma kavramını bir inceleyelim..
İyi bir Algoritma ;
* Hedef
* Koşullar
* Parametreler
Olarak sayabileceğimiz öğelerden oluşan bir kavramdır. Eğer bu öğeleri sorunsuz bir şekilde tamamlayıp, birleştirirseniz algoritmanızı tamamlamışsınız demektir.
Hedef, zaten belirli bir ihtiyaç analizi süreci sonrasında oluşturacağınız bir kavram, Diğer iki öğe ise bu hedefin nasıl, ne şekilde gerçekleşeceği üzerine yoğunlaşır.
Bana kalırsa, bu noktada en önemli öğe, ?koşul? öğesidir. Hedefine kilitlenmiş bir algoritmanın temelinde, koşul kavramı yatmaktadır. Hatta işin en eğlenceli kısmıdır diyebilirim. Şişman Adam?ın algoritmasında, tüm koşullar ?işe zamanında gitmek? hedefi üzerine şekilleniyor. O nedenle; uykusunu alamasa da, kahvaltıda karnını doyuramasa da hedefini gerçekleştirmek üzere, tek bir parametre yani saatin kaç olduğuna bakarak hareketine karar veriyor?
İşte bir bilgisayar programının çalışma algoritması da böyledir. Söz yine programa gelmişken şunu söyleyebiliriz?
Eğer program bir canlı olarak düşünülürse, programcı onun ebeveynidir. Büyüyünce ne olacağını (hedefi), hayata dair bilgileri (parametreleri) ve onları nasıl kullanacağını (koşullar) ona ebeveyni öğretir.
Eh.. Artık onun neden bir aşk olduğunu ve önemli bir aşk olduğunu sanırım daha net anlamışsınızdır. Bu yazı da size keyifli gelmişse, mutlaka bir programlama dilini öğrenmeye başlayın derim. İyi çalışmalar.
Daha önceki makalemizde belirttiğimiz gibi, programcılık, hayatın kendisidir. Bu nedenle, Şişman Adam üzerinden kavramları incelemeye devam edeceğiz.
Şişman adam; hareketlerine, yapacağı işlere nasıl karar verir ? Mutlaka ve mutlaka, herkes de olduğu gibi onun da bir karar mekanizması var ve bu mekanizma temel olarak neden ? sonuç ilişkisine dayanır. Bu ilişkideki ?nedensellik? ise en temelde var ? yok ya da evet ? hayır değerleri taşır. Efendim ? Elektronikteki gibi mi dediniz ?
Daha ötesine bakın lütfen... İnsanlardaki gibi desek çok mu abartmış oluruz ? Şu sözü, bir elektronik aygıt mı söyledi yoksa; ?Olmak ya da olmamak...? ? Evet insan düşüncesi de bu temel ilke ile karar veriyor: Herhangi bir eylemin gerçekleşip gerçekleşmediğine bakmak... Programcılıktaki adıyla; ?True? ya da ?False? olup olmadığına...
Şişman Adam?ın, bu konudaki örneklerine bir bakalım isterseniz...
Adamımız; günlerden birgün, yalnızlığa canının tak ettiğini düşünür ve biraz rahatlamak için (!) Bara gider. Barda meyve suyunu yudumlarken karşısındaki bayandan etkilendiğini hisseder. O anda ? farketmese de ? beyni şu şekilde düşünür:
EĞER karşıdaki bayan sana bakıyorsa
Git onunla konuş.
DEĞİLSE
Kısmet değilmiş.
KARAR VERİLDİ
Bu yapıyı VB.NET?e çevirirsek:
IF bayanbakıyormu = true THEN
MessageBox.Show("Git Konuş")
ELSE
MessageBox.Show("Kısmet Değilmiş")
END IF
İşte sevgili yazılım dostları, tüm yazılım dilleri için bel kemiği olan ?Karar yapıları? na temel bir giriş yaptık. Ancak tabii ki olay bu kadar değil. Olayı çok da uzatmadan Şişman Adam?a geri dönelim.
Şişman Adam?ın ayda bir kere psikolog bir arkadaşına gidip danışma gibi bir özelliği var. Şimdi size bu son görüşmeden kısa bir konuşmayı aktaralım.
?Her şey dokuz yaşımdayken başladı dostum... Kahvedeki o yaşlı amca beni o kadar yıpratmıştı ki, hala hatırladıkça tüylerim diken diken oluyor:
O gün, mahallede arkadaşlarımla oyun oynuyorduk. Birden kahvenin önünde oturan yaşlı bir adam yanıma geldi ve elinde tuttuğu boş Uzun Samsun paketini bana göstererek şu aşağıdaki cümleyi kurdu:
EĞER bu sigara varsa
Bu sigaradan al
YOKSA EĞER Kısa Samsun varsa
Onu Al
YOKSA EĞER Uzun Maltepe varsa
Onu Al
YOKSA EĞER Kısa Maltepe varsa
Onu Al
O KADAR
Bu cümleyi unutamadım dostum....?
Evet Şişman Adam?ın bu garip anısının tabii ki, VB.NET ile bir bağlantısı var. Yukarıdaki cümlenin aynısını bakın VB.NET dilinde nasıl yazıyoruz:
IF uzunsamsunvarmi = true THEN
Messagebox.Show(?Uzun Samsun Al?)
ELSE IF kisasamsunvarmi = true THEN
Messagebox.Show(?Kısa Samsun Al?)
ELSE IF uzunmaltepevarmi = true THEN
Messagebox.Show(?Uzun Maltepe Al?)
ELSE IF kisamaltepevarmi = true THEN
Messagebox.Show(?Kısa Maltepe Al?)
END IF
Sanırım farketmişsinizdir, şimdiye kadar karar yapılarını sadece bir eylemin sonucuna göre kullandık. Oysa ki, normal bir insan çoğu zaman, karar verirken birbirinden farklı birkaç eylemin sonucuna bakmaktadır...
Örneğin Şişman Adam, ÖSS?de barajı geçip de, sıra tercih aşamasına geldiğinde şöyle düşünmüştü:
?EGER puanım bu bölüme yetiyorsa VE bu bölümde okumak beni mutlu edecekse
Yazarım....
KARAR VERİLDİ.
Ya da daha spesifik bir örneği Şişman Adam?ın anılarından aktaralım:
Şişman Adam, katıldığı bir nikah töreninde şöyle bir gözlem yapmış:
Damat ve Gelin, nikah memurunun huzuruna çıktıkları anda, hayatları boyunca unutamayacakları en güzel ?evet? i diyeceklerini biliyorlardı. Ve yine bildikleri birşey vardı ki; içlerinden birinin ?hayır? demesi durumunda, bu evlilik gerçekleşmeyecekti.
Yani bir cümleyle şöyle özetlenebilir bu durum:
EĞER Damat ?evet? der VE Gelin de ?evet? derse
Evlenirler.
DEĞİLSE (İçlerinden biri hayır derse)
Evlenemezler
BUDUR.
İşte bu cümlede VB.NET? de kullanılan AND operatörünü anlamamıza olanak sağlayacaktır.
IF Damat = ?Evet? AND Gelin = ?Evet? THEN
MessageBox.Show(?Evlenirler?)
ELSE
MessageBox.Show(?Evlenemezler?)
END IF
Normal hayattaki kararlara geri dönelim...
Zaman zaman, öyle durumlar oluşur ki; karar vermeniz için iki eylemden birinin gerçekleşmesi yeterli olur. İşte bu durumda da VB.NET tarafında ?VEYA? anlamına gelen OR kullanırız...
IF Gun = ?Cumartesi? OR Gun = ?Pazar? THEN
MessageBox.Show(?Hafta Sonu?)
ELSE
MessageBox.Show(?Hafta İçi?)
END IF
Peki... her eylemin bir sonucu mu vardır şu hayatta ? Hayır tabii ki... Bazen, eylemin gerçekleşme şekline göre birden fazla sonuca kendinizi hazırlayıp ona göre karar vermeniz gerekir.
Bunun örneğini bakalım Şişman Adam nasıl veriyor...
Şişman Adam, paranoyak bir adam olduğu için, araba kullanırken ışıklara gelmeden neredeyse bir kilometre önceden aşağıdaki gibi düşünür...
Işıklara Ulaştığında
Işık Kırmızı ise
Duracak
Işık Sarı ise
Bekleyecek
Işık Yeşil ise
Geçecek
Bitti
İşte sevgili Şişman Adam fanatikleri...
Bu tarz bir karar mekanizmasını VB.NET ?de select case yapısını kullanarak yapıyoruz
SELECT CASE isiklar
Case is ?Kırmızı?
MessageBox.Show(?Dur?)
Case is ?Sarı?
MessageBox.Show(?Bekle?)
Case is ?Yeşil?
MessageBox.Show(?Geç?)
END SELECT
Gördüğünüz gibi dostlar... Programcılığı hayatın temellerinden ayıramayacağınızı bir kez daha gösterdik.
Şunu asla unutma ey sevgili okur... Burada olduğunuz sürece şişman adam maceralarına devam edecek.
Hepinize sağlam algoritmalı kodlar diliyorum...
Hayatın tüm anlarının, yazılımda bir karşılığı olduğunu artık anladınız biliyorum... Ama, durmayacak bu şişman adam ! Koşacak ve zayıflamayacak ! : )
Şimdi sevgili dostlar... Üçüncü makalemizde, şişman adamımız bizi döngülerin içine atıyor. Bakalım neler olacak...
Öncelikle, döngünün ne anlama geldiği hakkında biraz beyin fırtınası yaşayalım. Çoğu aksiyon filminde klişeleşmiş bir replik vardır : ?Zamanı geldiğinde harekete geçeceğiz.. Saatlerimizi ayarlayalım.? Bu repliği söyleyen arkadaş, koşul olarak kendisine zamanı seçiyor ve bu koşul gerçekleştiği an, eyleme geçiyor..
Biz yine buradaki ?koşul? kavramının felsefesine bir inelim. İnsan, her türlü hareketine ? yaşamının devam etmesi için zorunlu olanlar da dahil ? koşullar aracılığı ile karar verir. Zaman da, insanların icad ettiği koşullardan biridir bu durumda...
Peki.. Beklenen koşul gerçekleşmediğinde ne yapar ? Buna verilecek en temel yanıt, ?koşulun gerçekleşmesini bekler? olacaktır öyle değil mi ? Koşul gerçekleştiği anda ise, zafer onun olacak ve eylemine başlayacaktır. İşte tüm bu sürece biz, programcılıkta ?döngü? adını veriyoruz..
Bu kadar felsefi giriş yeter, Şişman Adam?a dönelim.. Bakalım o bize bunu nasıl anlatacak ?
Bizim Şişman Adam, bir zamanlar bir bankada yöneticilik yapıyordu. Kahramanımız, pek de otoriter biri sayılmaz ama, stratejist biri olduğu rahatlıkla söylenebilir. Günlerden birgün, mesai saatinin bitiminden yaklaşık bir saat önce, acilen bir yere gitmesi gerekir.
Bankadan çıkmadan önce, yaklaşık elli kişilik bir kuyruğun, bir banka memurunun önünde biriktiğini görür. Memurun yanına giderek şöyle der :
İşin bitmesi İÇİN Birinci kişiden başla, ellinci kişiye kadar birer birer git
Bir kişinin işini hallet
Sıradakini çağır.
Memur bu durumdan ne kadar memnun bilmiyorum ama yukarıdaki cümle sanki bir For Next döngüsünü çağrıştırıyor:
FOR kisi as integer = 1 to 50 Step 1
MessageBox.Show (kisi & ?. Kişinin işi yapıldı?)
NEXT
Bakın bir For...Next döngüsü için en temel parametreler karşımıza çıktı. Bunlar;
* Başlangıç Noktası
* Bitiş Noktası
* Başlangıç?tan Bitiş?e hangi adımlarla gideceği...
Buradaki, örnek lütfen sizi yanıltmasın... Örnekte; başlangıç noktası minimum, bitiş noktası maksimum (1 to 50) artış değeri ise 1 (step 1) olarak belirtiliyor. Ancak bu bir zorunluluk deği. Yani maksimumdan minimuma da For..Next döngüsü kurmak mümkün. Fakat bu durumda STEP -1 olarak verilmelidir.
FOR kisi as integer = 50 to 1 Step -1
MessageBox.Show (kisi & ?. Kişinin işi yapıldı?)
NEXT
Bakınız sevgili dostlar, For...Next döngüsü çalışırken üç tane zorunlu parametre sahibiyiz. Ancak, hayatımızdaki koşulların gerçekleşme süreçleri (döngüler) her zaman böyle spesifik parametrlerden oluşmazlar. Her ne kadar yurdum insanı, sorulan adrese hep ?100 metre ilerde solda? dese de, genelde spesifik bir değerden (50 kişi gibi) bir çırpıda bahsetmemiz pek olası değildir. Tabii Yağmur Adam gibi değilseniz...
Durum böyle olunca işin içine, spesifik parametre içermeyen; yalnızca, koşulun gerçekleşip gerçekleşmeme durumuna göre hareket eden bir döngü mekanizmasına ihtiyaç duyulur...
Ya tamam biliyorum biliyorum çok resmi gidiyor bu yazı... Hani şimdi Şişman Adam fanatikleri hafiften ?kısa kes beaaa, ben şişman adamı arıyorum? diyor olabilir. Tamam canım hemen sözü bizim Şişman Adam?a bırakıyorum...
Şişman Adam, akşamları eve trenle dönmeyi tercih ediyor genelde. Söğütlüçeşme tren istasyonundan bindiği banliyö treninden Atalar istasyonunda iniyor ve ulaşımında tren ya da otobüs kullanan çoğu insan gibi arada kaç tane istasyon olduğunu hiç bilmiyor.
Yani şişman adamın bilinci, trene bindikten sonra şöyle işliyor:
? Trenin durduğu istasyon Atalar?dan farklı olduğu SÜRECE
Trende Kal
Tren sonraki istasyona devam etsin
?
Bu ifadede görüldüğü gibi, spesifik olan tek şey, koşulun kendisi yani, tren istasyonunun Şişman Adam?ın ineceği durak olan Atalar?dan farklı olması.
Bu durumu bakın VB.NET?e nasıl çeviriyoruz
While istasyon <> ?Atalar?
Trende Kal
Sonraki istasyona git
End While
Bu kadar basit !!!
Şimdi sevgili dostlar... Programcılık aleminin ve VB.NET? in en sağlam döngüsü olan FOR EACH döngüsünü tamamen Şişman Adam?ın tombul ellerine bırakıyorum...
Şişman Adam, yalnız yaşayan bir adam. Yo yanlış anlamayın, asosyal olduğundan falan değil, evi o kadar dağınık ki, hiç kimse onunla yaşamaya tahammül edemiyor. Tabii her kahramanda olduğu gibi, bizim şişman adamın da duygusal bir yönü var. Gel gelelim bu duygusal taraf geçen günlerde dank etti ve adamımız bundan sonra temiz bir adam olacağına söz verdi.
Hemen evi temizlemek için bir algoritma düşündü... Düşündü... Ve aşağıdaki cümleyi kurdu :
Odanın içindeki herbir eşya için
Eşyanın tozunu al.
Sıradaki eşyaya geç.
Sonra da bunu günlüğüne aşağıdaki gibi geçirdi:
For Each esya in oda
MessageBox.Show (esya & ??nın tozu alındı?)
Next
Mükemmel bir döngü ! Kral bir döngü !!!
Sevgili algoritma aşıkları ! Döngülerde sık karşılaşılan bir mantıksal hataya karşı hepinizi uyarmak Şişman Adam?ın boynunun borcudur. Bu mantıksal hatanın adı : ?Sınırsız Döngü? dür. Ve yazılımcılar arasında, ?sınırsız döngülere giresice? diye bir takılma bile söz konusudur.
Makalenin başında belirttiğimiz döngü tanımına gönderme yaparak diyebiliriz ki; ?gerçekleşmesi mümkün olmayan bir koşula yönelik oluşturulan döngü, sınırsız döngüdür.?
Nasıl yani ? Şöyle yani... ?Kırmızı kar yağdığında, seninle evleneceğim? derseniz birine, yüzünüze tokadı yiyeceğiniz aşikardır. Çünkü, bu bir sınırsız döngüdür.
Örneğin For...Next döngüsünde anlatılan ikinci örneği sınırsız döngüye sokalım:
FOR kisi as integer = 50 to 1 Step 1
MessageBox.Show (kisi & ?. Kişinin işi yapıldı?)
NEXT
Dikkat !! 50?den başlan kisi degiskeni, 1?er 1?er ARTARAK 1? ulaşmaya çalışıyor ! 30 Şubat?da buluşuruz demek gibi birşey bu !!
Amman dikkat derim !
Evet sevgili dostlar... Şişman adam, bu maceranın da sonuna bu şekilde geldi. Bir sonraki makalede görüşmek üzere...
Şişman Adam?ın bir yenisi gelene kadar sınırsız döngüye girmemeniz temennisiyle...
Sevgili dostlarım; eğer bu maceraların takipçisiyseniz; yazılımın, hayatın tam içinden olduğunu biliyorsunuz demektir ve eğer bunun bilincindeyseniz; benden de böyle bir yazım tarzı bekliyorsunuz demektir?
Ama söz konusu Veritabanı olunca?
Ya? Heyecanlanmayın tamam? Şaka yaptım sadece ?Ama? sı falan yok? Veri tabanı da, hayatımızın içinden bir kavram?
Şöyle düşünün arkadaşlar (bu tarzı yemin ederim çok özlemişim.) Günlük hayatımızda, doğumumuzdan ölüme kadar olan süreç içersinde tüm yaşamsal ihtiyaçlarımızı karşılamamızda yardımcı olan en önemli şey nedir sizce? Hadi canım dürüst olun! ?Para? dır. Öyle değil mi?
Peki sizler günlük hayatınızda bu paraya sürekli ulaşabilmeniz, üzerinde işlem yapabilmeniz ve paranın güvenliğini sağlamak için ne yaparsınız? Sıralayalım:
* Anneme veririm, annemden alırım.
* Yastığımın içine koyarım.
* Testiye koyup bahçeme gömerim
* Bankaya yatırırım ve böylece internet, telefon gibi iletişim cihazlarını kullanarak parama istediğim zaman erişir, üzerinde işlem yapabilirim. Hem de güvenli olur.
Buradaki durumda; ?en hızlı ve güvenilir? olanı seçersek; bu seçenek hiç şüphesiz ki; ?Banka? olacaktır.
İşte sevgili dostlarım; günlük hayatımızdaki paranın yerini, yazılım hayatında ?veri? almaktadır. Bankanın yerini ise Veritabanı?
O zaman Yukarıda yer alan son maddeyi buna göre tekrarlayalım
?Veritabanını kullanarak verime istediğim zaman erişir, üzerinde işlem yapabilirim. Hem de güvenli olur? (yo hayır tabii ki copy-paste yapmadım ellerimle yazdım).
Arkadaşlar, üzerinde önemle duruyorum ki, veritabanına kavramına hakim olmak ve ona hak ettiği ehemmiyeti vermek çok önemli. Lütfen ve lütfen veri tabanı bilmeden yazılım konusunda çok fazla yol kat edilemeyeceğinin bilincinde olalım?
Bu benden beklenmeyen ciddi uyarıdan sonra, hayattaki örneklerimize geri dönelim?
Dostlarım; mademki, veriyi para ile bir tutuyoruz, bu yoldan hareketle şunu söyleyebiliriz, önemli olan parayı BİRİKTİRMEK değil YÖNETMEK? tir. Yoksa efenim enflasyonu var, devalüasyonu var? Risk yönetimini ciddiye almak lazım.
Yatırım yönetimi konusunda tecrübeli insanlardan öğrendiğim kadarıyla; paranın birbiriyle ilişkili olacak şekilde birden farklı yatırım kanallarına bölünerek değerlendirilmesi çok daha iyiymiş. Ama burada önemli olan kriter, yatırım kanallarının çok olması DEĞİL, ilişkilerinin sağlıklı olmasıymış?
Devam etmek isterim ama, konumuz SQL değil mi? Mademki veri eşittir para, o zaman acaba yatırımcı ağabeylerin / ablaların sözlerini veritabanında da kullanabilir miyiz ?
Evet, aslında sevgili dostlarım iki paragraf önce, ilişkisel veritabanı yönetimi sistemi ? Relational DataBase Management System (RDBMS) kavramına girmiş oldunuz. Yazılım dünyasına hayırlı ve uğurlu olsun.
Evet arkadaşlar, veritabanındaki yatırım araçlarımız ise tablolarımızdır. Tablolar arası kurulan ilişkiler aracılığıyla; verinize güvenilir ve hızlı erişir ve aynı oranda güncelleyebilirsiniz? İşte bu, verileri tablolara bölme ve tabloları birbiriyle ilişkilendirme yöntemlerine de normalizasyon adı verilir.
Dostlarım, tecrübeli yatırımcılar nasıl tecrübelerini diğer yatırımcılara aktarıyorlarsa, RDBMS kavramına yılların emeğini vermiş insanlar da bizlere öyle aktarıyorlar modelleme yöntemlerini? Normalizasyon kavramı da aslında bu tarz önerilerin bir manifestosudur. Söz gelimi; Excel?de oluşturulmuş bir belge de veri tabanı olarak düşünülebilir ancak ?hmm bak böyle yaparsan daha iyi olur? der bize normalizasyon?
Bir veritabanının normalizasyonunu oluştururken başlangıç olarak ?amaçladığınız sonuç? a karar vermelisiniz dostlar. Yani elinizdeki verinin olabilecek en detaylı çıktısını örnekleyerek yola çıkarsınız.
Hadi eğlence başlasın o zaman
Senaryomuz bir telefonla pazarlama şirketi üzerinden olsun. Bu şirketin, nasıl çalıştığını kaba taslak bir çizelim önce?
Şirketimiz birkaç kategoriden oluşan ve birkaç farklı tedarikçinin sağladığı ürünleri, kayıtlı müşterilerine ulaştırmaktadır. Satılan ürünler, anlaşmalı kargo şirketleri tarafından müşterilere ulaştırılmaktadır. Bu arada, şirketin çalışanları sattıkları ürünlere belli oranlarda prim alırlar. Bu durumda söz konusu şirket için sipariş verilerinin tutulması çok büyük önem taşımaktadır.
Bu paragraf, bazı şeylerin kafamızda canlanması için yeterli sanırım. Bakınız bazı kelimelerin üzerinden geçelim ve daha dikkatli olalım
* birkaç kategoriden oluşan
* farklı tedarikçinin sağladığı
* ürünleri
* kayıtlı müşterilerine
* anlaşmalı kargo şirketleri
* çalışanları
* sipariş
(Bu sefer copy ? paste yaptım. İtiraf ediyorum).
İstediğimiz en detaylı veri çıktısı ise aşağıdaki gibi olsun:
Sipariş No.........1
Müşteri Adı....... Ayhan Çalışkan
SiparişTarihi...... 07.01.2007
Gönd.Gereken T. 14.01.2007
Kargo Tarihi...... 10.01.2007
Kargo Ücreti..... 100 YTL
Alınan Ürün...... Plazma TV
Ürün Kategorisi. Elektronik
Ürün Adedi 1
Sipariş Toplam 2500 YTL
Şimdi? Biraz kendimizi zorlayalım ve bazı sorular soralım:
1. Böyle bir veriyi en hızlı ve en güvenli şekilde nasıl elde ederim
2. Bu veriden daha farklı olarak nasıl veriler üretilebilir ?
İkinci sorumuzdan başlayalım.
* Çalışanlar satışları üzerinden prim aldıklarına göre, hangi çalışanın ne kadar ürün sattığı bilinmek istenecektir.
* Hangi müşterinin belirli bir dönemde ne kadar ürün aldığı görülmek istenebilir.
* Bir tarih verilip, o tarihteki siparişler görülmek istenebilir.
* Kargo şirketlerinin durum takibi istenebilir
* En çok hangi ürünün satıldığı / kar ettirdiği bilinmek istenebilir.
* En çok kazandıran sipariş görülmek istenebilir
Ve daha fazlası.. Bu patronlar hep böyle canım isterler de isterler? Şimdi biz, bu veritabanının nasıl normalize edileceğine bakalım?.
Bir an için, bilgisayar diye bir şeyin icat edilmediğini var sayalım. Ama yine de, yukarıdaki raporları isteyen bir patron mutlaka olurdu herhalde !! (Ey sevgili patronum eğer bu yazıyı okuyorsan seni tenzih ederim? Sözüm meclisten dışarı
Şimdi madem bilgisayar yok, o zaman raporları hazırlamanız için kendinize bir ekip kurardınız di mi? Peki Bu ekibin görev dağılımı en verimli nasıl olabilirdi ?
Verimlilik derken şunu kastediyorum, ekibinizdeki tüm kişilerin performansı yüksek olmalıdır ki; istediğiniz raporu hızlıca hazırlayabilsinler. Çok sıkılıp bunalmasınlar. Her veriyi nerede bulabileceklerini çok iyi bilsinler. Yani o konuda uzman olsunlar.
Demek ki, ekipteki her kişiye uzman olması gereken bir konu vereceğim;
Örneğin;
* Mehmet bey; siz yalnızca çalışanların bilgilerinden sorumlusunuz. Her bir çalışanın, adı, soyadı, iletişim bilgileri, doğum tarihi sizden sorulacak
* Aykut bey; siz ise Kargo şirketlerinden sorumlusunuz efenim
* Emre bey, siz Kayıtlı Müşterilerden sorumlusunuz. Şirketin müşteri portföyündeki tüm bilgileri ne var ne yok bilmenizi istiyorum
* Cihan bey aramızdaki en tecrübeli sizsiniz bu nedenle Sipariş bilgilerini de size emanet ediyorum?Hangi siparişimiz hangi müşterimiz tarafından alınmış.. Hangi çalışan satmış, sipariş tarihleri falan sizden sorumludur efendim
* İlhan bey, siz siparişlerin bazı detaylarından sorumlusunuz. Örneğin hangi siparişte hangi üründen kaç adet var ? indirim felan yapılmış mı bu görev sizin?
* Derya hanım, siz ürün bilgilerinden sorumlusunuz?
* Ayhancım dostum, sen kategorileri çok iyi bileceksin. Ona hakim olacaksın hadi göreyim seni?
* Tuğrul bey siz de, efenim lütfen tedarikçi şirketlerimiz hakkındaki tüm verilere hakim olunuz?
Şimdi değerli ekip arkadaşlarım beni iyi dinleyiniz. İşleri hızlandırmak için şöyle bir şey yapacağız; Şöyle ki :
1. Ayhan ve Tuğrul bey siz telefon numaralarınızı Derya hanıma veriniz.
2. Derya hanım siz de telefon numaranızı İlhan bey?e veriniz lütfen.
3. İlhan bey siz, Cihan beyin de telefon numarasını alın?
4. Emre Aykut ve Mehmet bey sizlerde telefon numaralarınızı Cihan beye veriniz lütfen?
Bakın arkadaşlar bu sayede şöyle bir sistem kurmuş olduk;
Şimdi niye böyle bir şey yaptık? Şöyle düşünün yazılım dostları, ben Derya hanım?a, Ürünlerin hangi kategorilere ait olduklarını ve bu ürünleri kimden tedarik ettiğimizi sorarsam; Derya hanım hemen Ayhan bey?i arayarak ürünlerin kategorilerini soracak. Bilgileri aldıktan sonra da, Tuğrul beyi arayıp, tedarikçilerin isimlerini alacak. Yani, bu bilgiler, Derya hanım?da toplanacak ve istediğim rapor hazırlanmış olacak. Di mi ? Peki yukarıdaki ?en detaylı veri çıktısı? nı istersem?
O zaman;
1. Cihan Bey, Mehmet Bey?i arayarak, Çalışan ismini sorar
2. Cihan Bey, Emre Bey?i arayarak, Müşteri ismini sorar
3. Cihan Bey, Aykut Bey?i arayarak siparişi götüren kargo şirketini sorar
4. Cihan Bey, İlhan Bey?i arayarak hangi ürünün sipariş edildiğini sorar
5. İlhan bey bunu bilmediğinden, Derya hanımı arar ve ürün adını öğrenir
6. Derya hanım kategorisini öğrenmek için Ayhan bey?i arar
Ve ben raporumu yine elde ederim !!!!
Ya sevgili dostlar tahmin ettiğiniz gibi yukarıdaki senaryoda, ekibimde bulunan insanlar aslında birer tablo. Ve tablolar birbirlerine ilişkiler ile bağlı?
Bakın bir kavram daha görmüş oluyorsunuz böylece?.
PrimaryKey?ler ve ForeignKey?ler? Bunu şöyle açıklayalım?
Tuğrul bey?in cep telefonu numarası kendisinin PrimaryKey?idir?
Derya hanımın cep telefonundaki rehberde yer alan Tuğrul Bey?in numarası ise ForeignKey?dir?
Derya Hanım bu ForeignKey?i kullanarak Tuğrulbey?e ulaşır?
İŞTE VERİM DİYE BEN BUNA DERİM
Süper oldu ama di mi ? Ben yöneticilik mi yapsam ne ?
Evet sevgili yazılımseverler? Bu makalemde, normalizasyon kavramını naçizane Şişman Adam tarzında anlatmaya çalıştım sürç-i lisan ettiysek affola?
Umarım hoşunuza gitmiş ve veritabanı kavramının mantığını anlamışsınızdır?
Not: Bu makaleler sayın Türkay Ürkmez den izin alınarak sitemizde yayımlanmıştır.
Javascript
- this.setState({sign:"Here comes the sun...."})