Professional Documents
Culture Documents
Sürüm 1
05.07.2008
Katkıda Bulunanlar
Bahtiyar Dilek
Adem Özipek
Esra Ünver
http://projeabc.blogspot.com/
projeabc@gmail.com
Not Defteri
2
İçindekiler
Önsöz ....................................................................................................................................................... 4
Hikâye, Kapsamın ve İsterlerin Belirlenmesi ........................................................................................... 7
Çözümleme ve Tasarım ........................................................................................................................... 8
Kavramsal ................................................................................................................................................ 9
Adım Adım Uygulamayı Geliştirme........................................................................................................ 14
Çözümün Test Edilmesi ......................................................................................................................... 28
Sonsöz.................................................................................................................................................... 29
Not Defteri
3
Önsöz
On sekiz yıllık yazılım geliştirme deneyimi ve paralelinde on beş yıllık eğitim tecrübesi sırasında test
uzmanlığından proje yöneticiliğine, eğitmenlikten eğitim yöneticiliğine birçok pozisyonda görev
yaptım. Üniversitelerde ve çeşitli kurumların etkinliklerinde konuşmacılık yaptığım ve son sekiz yıldır
aktif olarak bilişim eğitim merkezlerinde çalıştığım sıralarda en çok duyduğum sıkıntı “yazılım
projelerine bütünsel bakış eksikliği” oldu.
Yazılım Mühendisliği
Yazılım mühendisliği, yazılım isterlerinin çözümlenmesinden, analiz, modelleme, kodlama, test, teslim
ve sonrasında bakım aşamasına ulaşan toplam süreci disipline etmeye çalışır. Amaç kaliteli yazılımlar
üretmek ve yazılımların ömürlerini uzatmak, yaşam süreçleri içerisinde geliştirilebilir/güncellenebilir
olmalarını mümkün kılmaktır.
Nereden Başlamalı?
Bu kadar çok aktörün dâhil olacağı, bu kadar yeni ve hala dünya çapında projelerin başarı oranının
%30’larda olduğu bir alanda bir şeyler yapmak çok kolay değil tabii ki. Ancak bir yerlerden
başlanabilir. Benim bu noktadaki misyonum, tabandan başlayarak birilerine ya da bir şeylere “değer
katmak.” İki temel kavram üzerine başlıyorum: kalite ve bütünsel bakış.
Not Defteri
4
"Mümkün Olduğunca Basitleştirin!"
Einstein’ın en sevdiğim sözlerinden biridir. Basitleştiremediğiniz hiçbir şeyi anlayamazsınız,
anlatamazsınız, çözemezsiniz. Karmaşık metotlarla yola çıkarak, tam olarak ne yaptığınızı
anlamadığınız yöntemlerle yazılım projelerinde başarılı olmak ancak mucize olur.
İşte bu nedenle ilk olarak Chip Online'da "Tek Kişilik Yazılımevi" blogunu yazmaya başladım. Bu
blogdaki amaç yazılıma bütünsel bakışın kodlama dışında kalan mühendislik adımları hakkında bilgiler
vermekti.
Diğer taraftan bu blog daha çok kavramsal tarafta ilerleyen bir yapıya sahiptir. Yani uygulama yapmak
için müsait bir ortam değildir. Bu nedenle anlattıklarımı uygulamalarla da desteklemek adına birkaç
yıldır aklımda olan başka bir projeyi daha hayata geçirdim: ProjeABC.
ProjeABC’de amacım programlamanın temellerini eğitimle, kursla, kitapla, internetten bir şekilde
öğrenmiş olan yazılımcı adaylarına bu öğrendiklerini bir araya getirerek nasıl uygulama
geliştirebileceklerini göstermek. Bunu yaparken, her bir uygulamaya hikâyesinden başlayıp, isterlerini
belirleyip, analizini ve tasarımını yapıp kodlamak ve tüm bu süreci de bir kitapçık haline getirerek
kaynak kodlarla birlikte sizlerle paylaşmayı hedefledim. Bu proje ve kitapçık bu kapsamdaki ikinci
çalışmadır.
Aylık ürettiğimiz projelerin hem kalite hem de sayı olarak artması tamamen siz okuyucuların aktif
katılımına bağlıdır. Projelerde aşağıdaki başlıklardan herhangi birinde görev alarak ya da yorumlarınız
ve görüşlerinizle bizi yönlendirerek katkıda bulunabilirsiniz.
Analist
Uygulamanın isterlerini belirler, analizini yapar.
Yazılım Mimarı
Mevcut analiz üzerinden uygulamanın nasıl kodlanacağını belirleyerek yazılım tasarımını yapar.
Görsel Tasarımcı
Uygulamada gerekli olan görselleri tasarlar. Uygulamanın genel görsel tasarımı konusunda
yönlendirmede bulunur.
Not Defteri
5
Yazılımcı VB
Tasarımı yapılmış olan uygulamayı Visual Basic 2008 ile kodlar.
Yazılımcı CSharp
Tasarımı yapılmış olan uygulamayı CSharp 3.0 ile kodlar.
Testçi
Uygulamayı isterlere uygunluğu açısından test eder.
Teknik Yazar
Uygulamayla ilgili teknik dokümanları ve yardım dokümanlarını hazırlar.
Lütfen her türlü geri bildiriminizi içinizden geldiği gibi ProjeABC blogundan ya da
projeabc@gmail.com adresinden benimle paylaşın.
Faydalı olması ümidiyle…
Kadir Çamoğlu
05.07.2008
İstanbul
Not Defteri
6
Hikâye, Kapsamın ve İsterlerin Belirlenmesi
Tek Kişilik Yazılımevi olarak geliştireceğimiz ikinci proje “Not Defteri” olarak belirlendi. Müşteri bize
aşağıdaki gibi bir taleple geldi.
“Windows işletim sistemi üzerinde çalışacak bir metin editörü isteniyor. Kullanıcının tercihlerine göre
ayarlayabileceği bu editör “text” dosya okuyabilecek ve yazabilecek. Kullanıcı metni daha kolay
okuyup yazabilmesi açısından font ve zemin renklerini düzenleyebilecek ve formu
boyutlandırabilecek.”
Sonrasında ekip olarak hızlı bir beyin fırtınası yaptık ve aşağıdaki listeyi elde ettik.
1. Hazırlanan not defterini “dll” olarak oluşturup bileşen olarak kullanılabilmesini sağlayalım.
2. Not defteri el yazısını da tanıyabilsin ve kayıt edip yükleyebilsin
3. Metin içinde kelime arayabilelim
4. Vista gadget ları benzeri bir şekilde sürekli olarak masa üstünde kullanabilelim
5. Html tabanlı olsun (Web uyumlu)
6. Günlük küçük notları hatırlatma özelliği olsun
7. Birden çok kullanıcı tarafından paylaşılabilir olsun
8. Office 2007'deki gibi fontu seçmeden önizleme (fontun üzerine gelip)
9. bu özelliğin farklı yerlerde de uygulanması(renk seçimi gibi)
10. Kurulumla birlikte gelebilecek küçük resim pakedi.(Clipart)
11. İmla denetimi olmalı
12. Yedekleme sistemi(Elektrik kesintisi yaşanırsa yarım kalan dosyayı kurtarabilme. Dosyayı
belirli zaman aralıklarıyla kullanıcının belirlediği bir klasöre yada sık kullanılan
(masaüstü,belgelerim) klasörlere atılması)
13. Sayfa özellikleri ayarlanabilmeli (yatay, dikey sayfa, satır aralıkları, paragraf boşlukları)
14. Farklı dosya türlerinde kaydedebilmeli
15. Arabirim boyutlandırılabilmeli ve font/renk ayarları yapılabilmeli
16. Kullanıcı tercihlerine göre ayarlanabilecek bir metin editörü dediğimiz için işe öncelikle
kullanıcı tercihleri neler olabilir bunu düşünerek başlarız;
17. Yazıyı ve arka planı renklendirmek mümkün olmalı
18. Yazı içerisinde arama yapılabilmeli
19. Developer menüsü olmalı. (html tagleri için)
20. Yazici menüsü olmalı
21. Yardim menüsü olmalı
Yukarıdaki liste “beyin fırtınası” çalışması olduğu için üzerinde düzeltme yapmadan orijinal halleriyle
almaya dikkat ettim.
Şimdi beyin fırtınası listesini inceleyin bakalım, basit bir not defteri talebini nereye vardırmışız…
1. Orta seviyede bir kelime işlemci (imla denetimi, farklı formatlarda kayıt, otomatik
kayıt/yedekleme, font ve renk vb. biçimlendirmeler, yazdırma, font vb. ön izleme)
2. HTML editörü. (Web uyumlu sayfalar oluşturma)
3. Günlük not uygulaması. (Post-it tarzı notlar alınacak, bunlar ekranda görüntülenecek,
gerektiğinde uygulama alarmla kullanıcıyı uyaracak.)
Not Defteri
7
Gelelim gerçek dünyanın “sınırsız istekler, sınırlı kaynaklar” fenomenine… Peki, bizim not defterimiz
ilk versiyonunda nasıl olmalı?
Proje İsterleri
Çözümleme ve Tasarım
Çözüm Tasarımı: Uygulama bir Windows projesi olacak. Textbox ve menustirp kullanılacak.
Dosya aç ve kaydet arayüzleri için saveasfiledialog ve openfiledialog kullanılacak. Renklerin
değiştirilmesi için ColorDialog, fontları değiştirmek için FontDialog kontrolleri kullanılacak. Diske
yazdırma ve okuma için de io streamreader ve streamwriter kullanılacak. Kullanıcı formu
kapatmak istediğinde bunu kontrol etmek için messagebox kontrolü kullanılacak.
Proje Tabanı – Bilgi Seviyesi : Metin Editörü uygulamasını geliştirmek isteyenlerin aşağıdaki
konuları biliyor olması gerekmektedir.
Not Defteri
8
Kavramsal
a. MenuStrip : Windows uygulamalarında kullanıcılar işlemlerini ya menüler ya da araç
çubuğu ile yapmaya alışmıştırlar. Vbee ile programlamada kullanıcıların menü olarak
Formun üst tarafında bulunan ve seçenekleri Toolbox’ın Menus & ToolBars
sekmesinde bulunan bir kontroldür. Formun üzerine sürüklenip bırakıldığında formun
en üst bölümüne otomatik olarak yerleşir.
Textbox ile ilgili olarak kullanılan en önemli özellik, Text property sidir. Textbox içine
girilen metni okumak ya da Textbox’a kod içerisinden bilgi yazmak için bu kodu
kullanılır.
Yukarıdaki kod TextBox1 isimli Textbox kontrolüne “Çağdaş Davulcu” metnini yazar.
Aşağıdaki kod ise çalıştığı anda TextBox2 içerisinde bulunan metni, mesaj kutusunda
gösterir.
MessageBox.Show(TextBox2.Text)
TextBox3.Multiline = True
Not Defteri
9
c. SaveFileDialog : Toolbox’ın Dialogs bölümünde yer alan ve dosyaları kaydetmeye
yardımcı olan bir kontroldür.
SaveFileDialog1.ShowDialog( )
Eğer belirli bir formatta dosya kaydetmek isteniyorsa Filter özelliği ile istenilen format
belirlenerek dosya kaydetme işlemi gerçekleştirilir. Örneğin sadece “txt” uzantılı
dosyaları kaydetmek istenirse aşağıdaki ifade kullanılır.
SaveFileDialog1.DefaultExt = “txt”
FileName özelliği kaydedilecek dosyanın adını verir. Aşağıdaki kod satırı ile dosyaAdi
değişkenine SaveFileDialog1 kontrolü içerisinde belirlenen kaydedilecek dosyanın
adına erişilir.
Not Defteri
10
OpenFileDialog : Bir klasör içerisindeki dosyayı açmaya yarayan kontroldür.
Title özelliği ile açılan OpenFileDilog’a başlık belirlenebilir. Yukarıdaki kod satırı ile
OpenFileDialog1 kontrolüne Açılacak dosya başlığı eklenir.
OpenFileDialog kontrolü kullanıcının direk olarak karşısına çıkan bir kontrol değildir.
Kullanıcıya OpenFileDialog kontrolü göstermek için bu kontrolün ShowDialog
methodu kullanılır. Aşağıda kullanımı yeralmaktadır.
OpenFileDialog1.ShowDialog( )
Fitler özelliği ile sadece istenilen formatta dosayaların açılması sağlanabilir. Aşağıdaki
kod satırı ile sadece metin dosyalarının açılabilmesi sağlanır.
OpenFileDialog1.InitialDirectory = “C:\”
FileName özelliği açılacak olan dosyanın adını verir. Aşağıdaki kod satırı ile
acılacakDosya değişkenine FileName özelliğinin değerini atamış olur. Böylelikle
kullanıcının hangi dosyayı açmak istediği bilinmiş olunur.
Kullanıcı açmak istediği dosyanın uzantısını belirtmez ise DefaultExt özelliğine atanan
değer devreye girer ve açılacak olan dosyanın default değeri belirlenir. Aşağıdaki kod
satırı ile bu özelliğe “txt” değeri atanır.
OpenFileDialog1.DefaultExt = “txt”
Not Defteri
11
diğer dialog kontrolleri gibi toolboxın Dialogs sekmesinde yer alır. En önemli işlevi
yazının fontunu ve rengini değiştirmektir.
FontDialog1.ShowDialog()
Font özelliği ile kullanıcının FontDialog üzeride hangi fontu belirlediği öğrenebilir.
Aşağıdaki örnek ile textbox1 adlı kontrolün içerisinde bulunan yazıların fontunu
FontDialog kontrolünün Font özelliğini kullanarak değiştirir.
TextBox1.Font = FontDilaog1.Font
FontDialog1.ShowColor = True
Kullanıcın FontDialog içerisnden seçtiği renk Color özelliği ile kontrol edilebilinir.
TextBox1 kontrolü içerisinde bulunan bir yazının rengi aşağıdaki kod ile değiştirilir.
TextBox1.Text = FontDialog1.Color
Kullanıcı yazıya altı çizili, kalın, yatık gibi efektleri yazıya uygulamak isterse
ShowEffects özelliği true değerini almalıdır. Eğer false değerini alırsa kullanıcı
belirtilen efektleri yazıya uygulayamaz.
FontDialog1.ShowEffects = True
e. ColorDialog : Uygulama içerisinde eğer bir kontrolün yada bir yaznın rengi
değiştirilmek istenirse ColorDialog kontrolünden yararlanılır.
Not Defteri
12
En yaygın özelliği ise Color’dur. Bir buttonun rengini ColorDialog’dan faydalanarak
değiştirelim.
Button1.BackColor = ColorDialog1.Color
ColorDialog1.FullOpen = true
f. Encoding : Türkçede kodlama anlamına gelen encoding ifadesi özel bir format içine
verimli taşıma ve saklama işlemleri için karakterleri sıralı bir biçimde koyma işlemidir.
Encoding içerisinde biraz önce belirtilen tanımda karakter setleri bulundurur.
Bunlardan bazıları ASCII, ANSI, UNICODE ve UTF-8’dir. Türkçe karakterlerden bazılar
ingiliz alfabesinde bulunmadığı için yazarken problem yaşanabilir. Ve bu problemi
ortadan kaldırmak için evrensel kod anlamına gelen unicode karakter setini
kullanmak gerekir. Daha detaylı bilgi için http://msdn2.microsoft.com/en-
us/library/system.text.encoding.aspx adresinden faydalanabilirsiniz.
g. StreamWriter :Uygulama içerisnde bulunan metni işletim sitemi üzerindeki bir dosya
içerisine yazmak istendiğinde StreamWriter sınıfı devreye girer. StreamWriter sınıfını
System.IO namespace’i içerisinde yeralır. IO’nun anlamı İnput-output’dur yani girdi-
çıktı. System.IO namespace’i verileri okuma yada yazma işlemlerinin yapıldığı bir
yerdir. StreamWriter, StreamWriter sınıfına verdiğimiz yazıyı akıntıya kapılan bir
deniz topu gibi sürükleyip belirttiğimiz dosyaya kaydeder. StreamWriter sınıfını
kullanmak için ilk önce onun örneğini oluşturmamız gerekir. Prjemiz içerisinde
encoding özelliğini kullanağımızdan StreamWriter sınıfının örneğini bu yolla
oluşturalım. Yazacağımız metinler Türkçe karakter içereceğinden farklı dil seçenekleri
ile kurulmuş işletim sistemlerinde çalışabilmesi için Encoding’ten faydalanmamız
gerekir. Encoding olarak Unicode ifadesini seçecek olursak bu problemi aşmış oluruz.
dim sw as new System.IO.StreamWriter(“C:\Deneme.txt”, False, _
System.Text.Encoding.Unicode)
sw.Write(“Merhaba Dünya”)
sw.WriteLine(“Merhaba Dünya”)
Not Defteri
13
Yukarıdaki kod ile StreamReader sınıfından C sürücüsü altında bulunan deneme.txt
adlı dosyadan veri okumak üzere yapılandırılmış sr adında bir nesne oluşturulmuştur.
Verileri okurken ReadToEnd yada ReadLine methodları kullanılır. ReadLine methodu
ile sadece tek bir satırı okuruz.
Textbox1.Text = sr.ReadToEnd()
Textbox1.Text = sr.ReadLine()
Yukarıdaki kod ile “C:\deneme.txt” dosyasının içerisindeki ilk satırı okuyup textbox1
içerisinde göstermiş oluruz.
Not Defteri
14
b. Form1 adlı formun size özelliğini 300;300 olarak belirleyelim.
Not Defteri
15
d. Forma Metin Editörü başlığını verelim.
e. Formun üzerine toolbox ın Menus & Toolbars bölümünde yer olan MenuStrip
kontrolünü sürükleyip bırakalım.
Not Defteri
16
f. Dosya ve Biçim adında elemanlarını MenuStrip kontrolüne ekleyelim .
g. Dosyanın alt bölümleri olarak Aç, Kaydet, Farklı Kaydet ve Kapat elemanlarını
ekleyelim.
Not Defteri
17
h. Biçim bölümünün altına ise Yazı Biçimi ve Form Biçimi adında iki eleman daha
ekleyelim.
MenuStrip kontrolü ile ilgili tasarımsal işlerimizi bitirdikten sonra dialogları ekleyelim.
İlk olarak Toolbox içerisinde bulunan dialogs sekmesinden SaveFileDialog kontrolü ekleyelim.
Not Defteri
18
j. Bir adet FontDialog kontrolü ekleyelim.
Not Defteri
19
l. Bir adet ColorDialog kontrolü ekleyelim. Böylelikle formumuzun üzerine
OpenFileDialog1, SaveFileDialog1, FontDialog1 ve ColorDialog1 adında dört adet
daha kontrol eklenmiş oldu.
m. Daha sonra formun üzerine bir tane textbox sürükleyip bırakalım. Ve textbox’ın
multiline özelliğini true olarak ayarlayalım.
Not Defteri
20
n. TextBox’ın dock özelliğini fill olarak ayarladıktan sonra karşılaşacağımız tasarım
aşağıdaki gibi olacaktır.
sonuc = FontDialog1.ShowDialog()
TextBox1.Font = FontDialog1.Font
TextBox1.ForeColor = FontDialog1.Color
End If
Not Defteri
21
p. Bu kod ile textbox’ın içerisindeki yazı tipi ve yazı rengini belirlemiş oluruz.
DialogResult : FontDialog penceresini açan kişinin tamam tuşuna basıp basmadığına
karar vermek için kullandığımız bir yöntemdir. Eger sonuc değişkenin değeri
DialogResult.OK olursa değişiklikleri TextBox1 üzerinde uygulamış oluruz.
sonuc = ColorDialog1.ShowDialog()
TextBox1.BackColor = ColorDialog1.Color
End If
r. Böylelikle Formun üzerinde bulunan MenuStrip1 içerisindeki Biçim bölümü ile ilgili
kodlama işlemlerini bitirmiş olduk.
s. Formun kod bölümüne geçelim ve adı currentPath olan global bir değişken
tanımlayalım ve bu değişkeni ilklendirelim.
Not Defteri
22
t. Artık Dosya bölümüne geçerek ilk önce StreamReader nesnesini ve OpenFileDialog1
kontrolünü kullanarak MenuStrip1 içerisindeki Dosya bölümünde bulunan Aç
özelliğini kodlamayla devam edelim. Aç üzerine çift tıklayalım ve açılan kod
bölümüne aşağıdaki kodları yazalım.
‘açabileceğiz.
OpenFileDialog1.InitialDirectory = "C:\\"
sonuc = OpenFileDialog1.ShowDialog()
‘okuduk
TextBox1.Text = sr.ReadToEnd()
sr.Close()
Me.currentPath = OpenFileDialog1.FileName
End If
Not Defteri
23
u. Bu adımda dosya bölümü içerisinde bulunan kaydetme işlemini kodlayacağız.
Kaydetme işlemi için StreamWriter nesnesini kullanacağız. MenuStrip içerisinde
bulunan dosya bölümüne geçelim ve Kaydet bölümüne fare ile çift tıklayarak açılan
kod satırına şu kodları yazalım.
False, System.Text.Encoding.Unicode)
sw.Write(TextBox1.Text)
sw.Close()
End If
v. Bir önceki adımda textbox1 kontrolü içerisinde bulunan değerleri bir dosya içerisine
yazdık ve bu işlemi yaparken Unicode karakter setini kullandık. Böylelikle Türkçe
karakter desteğini verebileceğiz.
SaveFileDialog1.DefaultExt = "txt"
sonuc = SaveFileDialog1.ShowDialog()
Not Defteri
24
‘Eğer kullanıcı OK butonuna basmış ise dosyayı streamwriter sınıfı
‘yardımıyla belirtilen path e kaydetmiş olduk.
SaveFileDialog1.FileName, _
False, System.Text.Encoding.Unicode)
sw.Write(TextBox1.Text)
sw.Close()
End If
Not Defteri
25
y. Burada FormClosing event’ini buluyoruz ve üzerine çift tıklayarak kod bölümüne
geçip şu kod satırlarını yazıyoruz.
sonuc = MessageBox.Show( _
"Cikis", MessageBoxButtons.YesNoCancel)
False, System.Text.Encoding.Unicode)
sw.Write(TextBox1.Text)
sw.Close()
Else
SaveFileDialog1.DefaultExt = "txt"
dialogSonuc = SaveFileDialog1.ShowDialog( )
Not Defteri
26
If dialogSonuc = Windows.Forms.DialogResult.OK Then
SaveFileDialog1.FileName, False, _
System.Text.Encoding.Unicode)
sw.Write(TextBox1.Text)
sw.Close()
End If
End If
e.Cancel = False
e.Cancel = True
End If
Me.Close()
Not Defteri
27
Çözümün Test Edilmesi
Aşağıdaki her bir kriteri teker teker deneyerek, uygulamanın başarım kriterlerine uyup uymadığını
denetleyelim.
Başarım Kriterleri:
1. Uygulama penceresi boyutlandırılabiliyor mu?
a. Uygulamayı çalıştıralım. Form açılınca formun genişliğini yada yüksekliğini
değiştirmeye çalışalım.
b. Formun yüksekliğinin ve genişliğinin değiştiğini göreceksiniz.
4. Kullanıcı var olan bir metin dosyasını ( .txt uzantılı dosya) açabiliyor mu?
a. Programımızı çalıştıralım.
b. Dosya menüsünde bulunan aç seçeneğine tıklayalım.
c. Açılan OpenFileDialog içerisinden bir .txt uzantılı dosya seçelim.
d. Dosyanın açıldığını göreceksiniz.
Not Defteri
28
e. Tamam butonuna bastığımızda değiştirdiğimiz ayarların metin kutusu içerisinde
bulunan verilerin renklerinin değiştiğini göreceksiniz.
8. Editörün zemin rengi değiştirilebiliyor mu?
a. Programımızı çalıştıralım.
b. Biçim menüsünde bulunan FormBiçimi bölümüne tıklayalım.
c. Açılan ColorDialog ile formun rengini ayarlayalım.
d. Tamam butonuna bastığımızda formun renginin değiştiğini göreceksiniz.
Sonsöz
Projemiz testleri de başarıyla geçtiğine göre müşteriye teslim edilebilecek hale gelmiş demektir.
Şimdi şöylece bir yaptıklarımızın üzerinden geçelim.
Tabii ki bu uygulamanın henüz sadece birinci versiyonu. Siz hataları ve özellik taleplerinizi ilettikçe
hem uygulamanın hem de kitapçığın yeni sürümlerini geliştirip sizlerle paylaşacağız.
Not Defteri
29