25 Şubat 2011 Cuma

ASP.NET Membership Sistemi ve Access Roller ve İzinler

ASP.NET Membership Sistemi ve Access Roller ve İzinler

Arkadaşlar Ders ingilizce ama adam tane tane anlatıyor göstererek Anlamamamk imkansız!

Veritabanından Gelen Verilerin Excel Çıktısı Alındığında Türkçe Karakterlerin Görünmeme Sorunu

Kaynak
   Bir süre önce, veritabanından gelen bilgileri bir datalistte görüntüledikten sonra istendiğinde bu listenin excel çıktısının alınabilmesi gerekiyordu.
   Bunun için runtimeda datalisti bir form içine alıp bu formu render ederek saya çıktısı olarak aldım. Tabi sayfaya bir header ekleyerek çıktının attachement olarak verilmesini, yani, download edilebilir şeklinde olmasını sağladım.
   Fakat aldığım excel dosyalarında Türkçe karakterlerin yerine farklı karakterler görünüyordu. Verilerin de bolca türkçe karakter içerdiğini bildiğim için bunun giderilmesi gerekiordu. Tabiki ilk akla gelen sayfanın encoding bilgisini değiştirmek oldu.
Response.ContentEncoding = Encoding.UTF8;//bu deneme başarısız oldu. çok üzüldüm :(
   Birkaç deneme daha yaptıktan sonra aklıma Encoding classının GetEncoding metodu geldi. Bununla bir encoding vermeliydim diye düşündüm.
Response.ContentEncoding = Encoding.GetEncoding(1254);//sonuç başarılı :)
   Neden 1254 derseniz => http://tr.wikipedia.org/wiki/Windows-1254

JQuery İle Akordiyon İçerik Nasıl Oluşturulur



    Bu yazıyı 'En güzel şey kendin yazarsan olur' gibi bir söz ışığı altında hazırlıyorum :)
<script type="text/javascript">
        $(document).ready(function() {
            $(".AccordionContent").hide();
            $(".AccordionTitle").click(function() {
                $(".AccordionContent").slideUp("normal").hide();
                $(".AccordionTitle").removeClass("active");
                $(this).addClass("active");
                $(this).next(".AccordionContent").slideToggle("slow,");
            });
        });
</script>
   Akordiyon içeriğimizin, açılır kapanır bir hale getirecek olan javascript kodumuz yukarıda görüldüğü gibidir. Yapılan iş gerçekten basit, jquery 1.3.2 referans olarak eklendikten sonra buradaki metot desteğini edinmiş oluyoruz. Öncelikle AccordionContent classını kullanan tüm elementleri hide metodu ile gizliyoruz. Daha sonra AccordionTitle class ını kullanan tüm başlık alanlarının click eventlarına bir fonksiyon ekliyoruz. Fonksiyondan da anlaşılacağı üzere yaptığımız işlem; öncelikle tüm içerikleri gizlemek ki bunu isterseniz yapmayabilirsiniz (eğer yapmazsanız açtığınız tüm akordiyonlar açık kalacaktır.), daha sonra tüm başlıkların class attribute ünü siliyoruz ki sadece yeni aktif olacak olan başlık aktif görünümü alabilsin. Yeni başlığa active classını verdikten sonra içeriğimizi jquery nin bize sağladığı metotlardan olan slideToggle ile içeriğimizi görünür hale getiriyoruz.
   Burada önemli olan yerlerden bir tanesi, this ile aktif olacak başlığı yakaladıktan sonra, next ile aktif başlık elementinden sonra gelen ilk AccordionContent classına sahip olan elementi yakadığımızdır. Yani Title ve Content alt alta eklenmelidir.
  Akordiyonda kullandığım stiller ise aşağıdaki gibi;
<style>
        .AccordionTitle
        {
            background-color: LightGrey;
            color: DarkGreen;
            font-weight: bold;
            padding: 5px;
            margin-bottom: 5px;
            cursor:pointer;
        }
        .active
        {
            background-color: DarkGreen;
            color: LightGrey;
        }
        .AccordionContent
        {
            padding: 5px;
            border: solid 1px DarkGreen;
            display: block;
            margin-top: -5px;
            margin-bottom: 5px;
        }
</style>
   Daha sonra AccordionTitle için bir arkaplan resmi tanımlayıp active classı için de bir başka arkaplan tanımlayarak daha efektif bir akordiyon oluşturabilirsiniz.
   Sayfamıza ekleyceğimiz örnek akordiyon içerikleri de aaşağıdaki gibidir, kendinize göre düzenledikten sonra rahatça kullanabilirsiniz.
  
<div class="AccordionTitle">
        Lorem Ipsum Nedir?
    </div>
    <div class="AccordionContent">
        Lorem Ipsum, dizgi ve baskı endüstrisinde kullanılan mıgır metinlerdir. Lorem Ipsum,
        adı bilinmeyen bir matbaacının bir hurufat numune kitabı oluşturmak üzere bir yazı
        galerisini alarak karıştırdığı 1500'lerden beri endüstri standardı sahte metinler
        olarak kullanılmıştır. Beşyüz yıl boyunca varlığını sürdürmekle kalmamış, aynı zamanda
        pek değişmeden elektronik dizgiye de sıçramıştır. 1960'larda Lorem Ipsum pasajları
        da içeren Letraset yapraklarının yayınlanması ile ve yakın zamanda Aldus PageMaker
        gibi Lorem Ipsum sürümleri içeren masaüstü yayıncılık yazılımları ile popüler olmuştur.
    </div>
    <div class="AccordionTitle">
        Nereden Gelir
    </div>
    <div class="AccordionContent">
        Yaygın inancın tersine, Lorem Ipsum rastgele sözcüklerden oluşmaz. Kökleri M.Ö.
        45 tarihinden bu yana klasik Latin edebiyatına kadar uzanan 2000 yıllık bir geçmişi
        vardır. Virginia'daki Hampden-Sydney College'dan Latince profesörü Richard McClintock,
        bir Lorem Ipsum pasajında geçen ve anlaşılması en güç sözcüklerden biri olan 'consectetur'
        sözcüğünün klasik edebiyattaki örneklerini incelediğinde kesin bir kaynağa ulaşmıştır.
        Lorm Ipsum, Çiçero tarafından M.Ö. 45 tarihinde kaleme alınan "de Finibus Bonorum
        et Malorum" (İyi ve Kötünün Uç Sınırları) eserinin 1.10.32 ve 1.10.33 sayılı bölümlerinden
        gelmektedir. Bu kitap, ahlak kuramı üzerine bir tezdir ve Rönesans döneminde çok
        popüler olmuştur. Lorem Ipsum pasajının ilk satırı olan "Lorem ipsum dolor sit amet"
        1.10.32 sayılı bölümdeki bir satırdan gelmektedir.
    </div>
    <div class="AccordionTitle">
        Nereden Bulabilirim
    </div>
    <div class="AccordionContent">
        YLorem Ipsum pasajlarının birçok çeşitlemesi vardır. Ancak bunların büyük bir çoğunluğu
        mizah katılarak veya rastgele sözcükler eklenerek değiştirilmişlerdir. Eğer bir
        Lorem Ipsum pasajı kullanacaksanız, metin aralarına utandırıcı sözcükler gizlenmediğinden
        emin olmanız gerekir. İnternet'teki tüm Lorem Ipsum üreteçleri önceden belirlenmiş
        metin bloklarını yineler. Bu da, bu üreteci İnternet üzerindeki gerçek Lorem Ipsum
        üreteci yapar. Bu üreteç, 200'den fazla Latince sözcük ve onlara ait cümle yapılarını
        içeren bir sözlük kullanır. Bu nedenle, üretilen Lorem Ipsum metinleri yinelemelerden,
        mizahtan ve karakteristik olmayan sözcüklerden uzaktır.
    </div>
  Not: Hazırladığım bu akordiyon örneği bu tarihe kadar, internet explorer, firefox, chrome ve safari tarayıcılarının en son versiyonlarında test edilmiş ve başarılı olmuştur.

JavaScript Nesne Oluşturmak ( OOP )

Neredeyse her projemizde javascript kullanıyoruz. Peki OOP yapısını javascript yazarken de kullanıyor muyuz? Cevap hayır ise; bir yerden başlamak gerekiyor. Gelin nasıl nesne oluşturabildiğimize bir bakalım.
function makale(baslik,kategori,icerik) {
            this.baslik = baslik;
            this.kategori = kategori;
            this.icerik = icerik;
        }
   Gördüğünüz gibi, nesnemizi bir function olarak oluşturduk. Aldığımız parametreleri makale adlı nesnemize(function) property olarak atadık.

   Şimdi de nesnemizi nasıl kullanacağımıza bir bakalım.

var m = new makale('Javascript Nesne Oluşturmak', 'Javascript', 'Makale içeriği girilecek..');
            alert('Başlık : ' + m.baslik + '\n' +
                  'Kategori : ' + m.kategori + '\n' +
                  'İçerik : ' + m.icerik);

   Buraya kadar hiçte farklı birşey olmadığını gördük. Gerek nesne oluşturmak gerekse nesnemizin bir instance ını oluşturmak için çok farklı şeyler yapmadık. Eğer bir programlama dili biliyorsak ki biliyoruz :) hiç zorlanmayacağız.

   Peki çok kullandığımız bir şey daha var, biz genellikle nesnelerimizi oluşturduğumuzda object sınıfına ait olan ToString metodunu ezerek(override) nesnemize uygun bir geri dönüş değeri oluştururuz. Bunu javascript'te nasıl yapacağımıza bir bakalım şimdi ;

function makale(baslik,kategori,icerik) {
            this.baslik = baslik;
            this.kategori = kategori;
            this.icerik = icerik;
            this.toString = function() { return this.baslik; };
        }

   Gördüğünüz gibi javascript dilinde nesnelere ait olan toString metodunu bir function ile değiştirdik kendi nesnemiz için. Artık oluşturduğumuz nesne için toString metodunu çağırdığımızda nesnemizin baslik propertysini döndürecektir.

function getir() {
            var m = new makale('Javascript Nesne Oluşturmak', 'Javascript', 'Makale içeriği girilecek..');
            alert('Başlık : ' + m.baslik + '\n' +
                  'Kategori : ' + m.kategori + '\n' +
                  'İçerik : ' + m.icerik+'\n'+
                  'toString : '+m.toString());
        }


22 Şubat 2011 Salı

Sql Injection Nasıl Yapılır?

Sql Injection Örneği

Execute XML Reader Nasıl Kullanılır

Xml Web Servisi ve Örneği [ Video ]

Asp.Net Web Config - Web.Config Ayarları [ Video ]

jQuery Ajax Metodu ile Veri Eklemek

jQuery ile Form Kontrolü Yapalım

Ajax Jquery Metin Boyutu Değiştirme

Ajax Jquery Floating (Kayan) Alan Yapımı

Ajax Jquery Animate Komutu

Ajax Jquery Post İşlemi

Ajax jquery ile Div İçine Veri Eklemek

jQuery Görsel Ders [ İngilizce ]

Güzel bir jQuery Görsel dersi yaklaşık 1 saatlik ders..

Resmin Orjinal boyutu için Resme tıklayın


20 Şubat 2011 Pazar

ASP.NET ile CheckBox'dan Seçilen Kayitlari Veritabanından Silme

Örnegin Hotmail ,gmail gibi sitelerde gelen kutusundan silmek istedigimiz maillerin yanindaki checkbox lari seçip sil butonuna basariz ve tek seferde tüm seçilen mailleri sileriz.
Bu uygulama veritabani olarak Access  kullanilacak ve senaryo geregi veritabaninda kayitli olan mailleri listeleyip istegimiz mailleri seçip silecegiz.
Il olarak veritabanindan verileri çekelim ve bir dataliste aktaralim .















Simdi de kodlari asagidaki gibi yazalim
(sayfamiza using System.Data.OleDb ve using System.Data name spacelerini  eklemyi unutmuyoruz tabi)

Default.aspx.cs


18 Şubat 2011 Cuma

JQuery Türkçe Dersler 10- Hover Metodu

Hover metodu nesnelere mouse pozisyonu ile fonksiyon atama işlevidir.

JQuery Türkçe Dersler 9- Toggle ve Toggle Class

jQuery Video derslerimizde daha önce görmüş olduğumuz hide / show metodlarına bir alternatif olarak toggle metodu bulunmaktadır. toggle metodu belirlediğimiz nesneyi kaybedip daha sonra tekrar gösterebilme fonksiyonudur.

toggleClass ise; belirlediğimiz nesnelerin CSS sınıf ayarlamarını isteğimiz doğrultusunda değiştirip tekrar aynı haline geri alma fonksiyonudur.

JQuery Türkçe Dersler 8- Varyasyon oluşturma ve silme

Sayfamıza jquery kullanarak var komutu ile yeni bir varyasyon oluşturma daha sonra bu varyasyonu fonksiyonlarımızda kullanarak örnek olarak yaptığımız listemizde yeni listelerin oluşmasını sağladık.

JQuery Türkçe Dersler 7- Animate Metodu

JQuery Türkçe Dersler 7- Animate Metodu

JQuery Türkçe Dersler 6- Slide,Hide ve Fade Metotları

JQuery Türkçe Dersler 6- Slide,Hide ve Fade Metotları

JQuery Türkçe Dersler Kurulum ve Kullanımı Başka bir ders

jQuery Kurulum ve Kullanımı

Daha kaliteli görüntü için download manager'la videoyu indirin.

JQuery Türkçe Dersler 5-Filtreler ve Seçimler Dersi

jQuery Filtreleri kullanarak daha detaylı seçimler yapalım

JQuery Türkçe Dersler 4- CSS Class'larla Çalışmak

jQuery ile HTML elemanlarına CSS sınıflarını atamak


JQuery Türkçe Dersler 3- CSS'le çalışmak Temel

JQuery Türkçe Dersler 2- Kurulum ve Kullanımı


JQuery Türkçe Dersler 1-Giriş

-----Jquery Giriş------

8 Şubat 2011 Salı

Nesne Yönelimli Programlama – 6 Access Modifiers

Öncelikle erişim düzenleyici dediğimiz anahtar kelimelerin ne işe yaradığı hakkında genel bir tanım yapalım. Bir tipin kendisine veya o tipe ait üyelere (metod, özellik ya da olay) nasıl erişileceğini daha doğrusu, nereden (hangi kod bloğundan) erişelebileceğini belirleyen kelimelere "erişim düzenleyiciler" diyoruz. İşte şimdi bu kelimeleri, tek tek anlatmaya sıra geldi.

private

En minik erişim düzenleyicisidir. Tipin üyelerinde kullanılır. Üyenin (bu üye metod veya global değişken –alan- olabilir), yalnızca o tipin içerisinden erişilmesine izin verir. Yani üyenin o tipe "özel" olmasını sağlar. Adı üzerinde! Başka bir değişle, private anahtar kelimesi ile tanımlanmış bir üyeye, tip dışından ulaşamazsınız. Ha unutmadan: private üyeler miras yoluyla türetilmiş sınıflara aktarılamazlar. Bir şey daha, eğer bir üyenin önüne hiçbir erişim düzenleyici anahtar kelimesi belirtmezseniz, o üye derleyici tarafından private olarak algılanır. Yani private, üyeler için varsayılan erişim düzenleyicisidir.

public

En genel ve sınırsız erişim düzenleyicisidir. Hem tip için hem de, tip üyeleri için kullanılabilir. Elbette her ikisi için de farklı anlamları vardır. Önce tipler için konuşalım. Örneğin, bir sınıfın erişim düzenleyicisi public ise bu, o sınıfın, bulunduğu assembly dışından (referans olarak alındığı başka bir assembly'den) her türlü erişilebileceği anlamına gelir. Peki, tipin üyeleri public ise ne olur? Yine adı üzerinde. public, "genel" demektir. Yani, o üyeye her yerden erişilebilir.Doğal olarak kalıtım yolu ile türetilmiş sınıflara aktarılırlar.
Şimdiye dek anlattığım erişim düzenleyicileri hakkında zaten az çok birşeyler duymuşsunuzdur. Sınıflarımda bu konuyu anlatırken, öğrencilerimin yüz ifadelerinin en çok değiştiği erişim düzenleyicelere geldi sıra (bu ifade değişimi genellikle şöyle yorumlanır; "ee nerede kullanacağız lan bunu?" ya da "anlamadım ki!").

protected

"Korunan" anlamına geldiği aşikar. Peki ama kim kimden korunuyor ("şşşt!! Değiştirmeyin yüz ifadenizi hemen")? Peki, sadece tipin üyelerinde (metod veya alan) kullanılabilir (aynı private gibi). Bu üyeye yalnızca ait olduğu tip içinden ulaşılabilir (aa! Bu da private gibi). E o zaman, private'den farkı nedir? İşte tek fark: protected olarak tanımlanmış alan ya da metodlar, miras olarak aktarılabiliriler. Yani, "bu üyeye kesinlikle dışardan ulaşılamasın, ama miras bırakılabilsin" diyorsanız, o üye protected olmalı.
Peki ne zaman, nasıl bir modelde buna ihtiyaç duyarsınız? Şöyle hayal edelim; "personel" isminde bir sınıfınız var ve bu sınıfın da "maasHesapla" isminde bir metodu var. Metod basitçe, mesai saati ve saat ücretlerini alıp çarpıyor. Şimdi, bu sınıfın temel sınıf olmasına karar verdiniz. Muhendis ve Muhasebeci sınıflarını buradan türeteceksiniz. E onlarda da maasHesapla metodu olacak (yani kalıtım yoluyla aktarılacak – private olamaz). Ama siz, bu sınıfların dışından (yani sınıfın örneğinden) maasHesapla metoduna erişmek istemiyorsunuz (o zaman public olma şansı yok). İşte bu durumda maasHesapla metodu, protected olmalı.
Örneklerle bakalım: 


Yukarıda mevzu bahis Personel isimli sınıfımı görüyorsunuz.  

 
Burada ise, türetilmiş sınıfım olan Muhendis içinde, "Ornek" isimli metodda, this anahtar kelimesiyle; Personel sınıfından kalıtım aldığım "maasHesapla" metoduna ulaşabiliyorum. Burada bir hatırlatma yapalım; this anahtar sözcüğü, yalnızca o sınıfın (örneğimizde Personel sınıfı) üyelerine ulaşmak için kullanılır. Böylece, kabaca "miras bırakılabilen, fakat dışarıdan ulaşılamayan alanlar protected erişim düzenleyicisi ile belirlenir" diyebilir miyiz? Bence deriz güzel de olur!

internal

"Dahili" anlamına gelmektedir. Yalnızca bulunduğu assembly'den erişilebilir. Burada assembly ifadesinden kasıt, projenin kendisidir. Yani, bir kütüphane (.dll) oluşturuyorsanız, internal bir sınıfa sadece o kütüphaneden ulaşabilirsiniz. Bu erişim düzenleyicisi, sınıf üyelerinde de kullanılabilir. Onda da etkisi aynıdır. Bir sınıfın erişim düzenleyicisi belirtilmezse, varsayılan olarak internal kabul edilir.

protected internal

Yalnızca sınıf üyelerine uygulanır. Kelimelerin arasına "ya da" konulunca anlaşılması daha kolay olacaktır. Erişim yapılan yere göre "internal" ya da "protected" davranır. Doğal olarak assembly dışından erişilmeye çalışıldığında internal, aynı assembly'den erişilmeye çalışıldığında ise proyected davranır.



Kaynak:turkayurkmez.com

Nesne Yönelimli Programlama – 5 Polymorphism

Şimdi çok biçimlilik kavramını anlamak üzere yine bir nesne modelleyelim isterseniz. Bu kez bir e-ticaret sitesinde, ürün satışı yapmak için kolları sıvıyoruz. Bu e-ticaret sitemiz, sanal market olsun. Yani hem gıda hem de elektronik ürünleri satabilecek bir portal. Site kullanıcısı, satın almak istediği ürünü sepete ekler. Siparişi vermeden önce, sepetteki tüm ürünlerin fiyatları toplanır ve ödenmesi gereken miktar belirlenir. Ha unutmadan, doğal olarak bu ürünlerin KDV oranları da farklı (haydi hayırlısı) olacak ve elbette fiyat ona göre hesaplanacak.
Haydi bakalım. Öncelikle dilerseniz Urun isminde bir sınıf oluşturalım. Site üzerinden satışını gerçekleştirdiğimiz tüm ürünlerin ortak alanları burada olsun.

Sınıf üyelerim gayet basit gördüğünüz gibi. Buradaki amacım, size çok biçimlilik kavramını anlatabilmek olduğu için, diğer sınıflarımın da basit olmasına özen göstereceğim (bazen böyle açıklamaları neden yaptığımı hiç anlayamıyorum. Boşverin takılmayın siz.). Bu sınıfta KDVUygula metoduna dikkat!! Varsayılan olarak, ürün fiyatına %8 oranında KDV uyguluyorum.
Peki gelelim diğer sınıflara. Urun sınıfından Tekstil, CepTelefonu ve kuru gıda ürünlerini temsil edecek sınıflarımı türetiyorum. Evet.. e dedim ya polymorphism'i anlamak için miras kavramını bilmek gerekir diye... Her neyse.
Tekstil:






Peki, şimdi de Sepet sınıfımızı yazalım. Bu sınıf, ürünlerimizi taşıyacak ve "ödenmesi gereken tutar" ı bizim için hesaplayacak.





Şimdi, bu makaleyi yazarken, doğru KDV oranlarını bulmak için bu siteye baktım durdum. Ekmeğin KDV oranı %1, cep telefonu %18, tekstil ürünlerinin ise %8. Şöyle kolay hesaplayacağımız örnek fiyatlar vererek, elde etmemiz gereken KDV dahil fiyatları bir görelim. Eğer ekmeğin kdv hariç fiyatı 10 kuruş olsaydı, KDV dahil fiyatı 10 x 1.01 = 10,1 kuruş olacaktı. Peki bakalım bizim şu sınıflar, bu fiyatı hesaplayabilecek mi? Görelim:







Hmm... İşte sorun! Ama bu sorunu, eminim ki teşhis etmişsinizdir. İçinizden diyorsunuz ki, "eh be şişman adam, Urun sınıfındaki KDVUygula metodu varsayılan olarak %8 vergi uygularsa böyle olur". Peki tamam. Nasıl çözeceğiz o zaman bu sorunu? KDVUygula metodunu Urun sınıfından kaldırmamı beklemeyin. Çünkü tüm ürünlerimde (tekstil,cep telefonu ve ekmek) bu metod var. O zaman şöyle diyebilir miyiz, evet tüm ürünlerde KDVUygula olmalı ama, hepsinde FARKLI çalışmalı! Evet işte şu an da çok biçimli olması gereken bir KDVUygula metoduna ihtiyaç duyuyorsunuz! Hazır bu ihtiyacı duymuşken, şu polymorphism'in tanımını bir yapalım. Temel sınıftan, türetilmiş sınıfa kalıtım yoluyla aktarılan, fakat türetilmiş sınıfta farklı bir şekilde kullanılabilmesine izin verilen sınıf üyesi, çok biçimli bir üyedir. Buraya kadar bu yazıyı okumuşsanız, hala sıkılmamışsınız demektir. Öyleyse, bir şişman adam örneği hakettiniz!
Çok değil bundan bir elli atmış yıl önce, babalarımız dedelerimiz bizden çok daha doğal besleniyorlardı öyle değil mi? Fakat biz, hazır yiyeceklerle biraz daha haşır neşiriz. Peki bu beslenme dediğimiz olay canlıların tümünden bize kalıtımla aktarılan birşey değil mi? Evet ama, kalıtımdan kalıtıma bu beslenme şekli oldukça değişmiş! İşte size, atalarımızdan aldığımız çok biçimli bir metod... Beslenme metodu!
Peki, bu çok biçimliliği kendi sınıfımıza uygulama zamanı geldi. Bakın Urun sınıfımdaki KDVUygula() metoduma ne yapıyorum:





"virtual" anahtar kelimesini ekleyerek metodumun çok biçimli bir metod olduğunu gösterdim. Şimdi de, bu metodun yapısını, türemiş sınıflarımda nasıl değiştireceğime bakalım. Hemen Ekmek sınıfına gidelim ve override kelime sini yazdıktan sonra neler geldiğine bir bakalım:





İşte! KDVUygula orada! Demek ki sadece virtual imzalı sınıf üyeleri override edilebilirler (Bu arada override; çiğnemek,ezmek anlamına gelir ). Biz KDVUygula metodunu seçerek yola devam edelim ve metodun gövde kodunu değiştirelim:





Şimdi az önce yanlış hesapladığını gördüğümüz kodu tekrar çalıştırıyorum. Bakalım sonuç ne olacak:








İşte bu! Çok biçimlilik bir kez daha günü kurtardı. Teşekkürler nesne yönelimli programlama, teşekkürler çok biçimlilik.

 Yukarıda override kelimesini "ezmek" olarak tanımlamıştım. Peki kim neyi eziyor? Biraz buraya odaklanalım. Unutmayın ki, bu örnekte tüm ürünlerimde KDV uygulanması gerektiğinden dolayı Urun sınıfına KDVUygula metodunu ekledim. Sepet nesnesinde ödenecek tutarı hesaplarken de urun nesnesinin KDVUygula metodunu kullandım. Yine örnekte sepet.Ekle(Urun urun) metodunu kullanarak bir Ekmek nesnesini, sepete ekledim. Aradaki miras ilişkisi sayesinde bunu yapabildim. Sonuç olarak, Ekmek sınıfı içinde yer alan KDVUygula metodu, Urun içindeki KDVHesapla metodunu geçersiz kıldı yani ezdi. Böylece, ekmek için %1 KDV uygulanması gerektiğini belirtebildim.

Yazar:Türkay Ürkmez
Kaynak:turkayurkmez.com





Nesne Yönelimli Programlama – 4 Inheritance

Inheritance, basitçe bir class'dan başka class'lar türetmektir. Peki, bu bizim ne işimize yarar? Neden bir class'dan başka class'lar türetelim ki? Bu sorunun cevabı, tahmin edeceğiniz gibi günlük hayatta yer alıyor sevgili yazılım aşıkları. Şöyle bir düşünün; insanlar, günlük hayatında kullandıkları nesneleri kategorize eder ve geneller. Ne demek istediğimi şöyle anlatayım; öğlen yemeğinizi bitirdiniz ve iş yerinize dönüyorsunuz. O sırada bir arkadaşınızla karşılaştınız. Arkadaşınız, nereden geldiğinizi sorduğunda ona "kuru-pilav yemekten" demek yerine "öğlen yemeğinden" dersiniz.İşte genellediniz! Veya başka bir örnek şöyle olabilir. Bir bilim-kurgu filmi almaya DVD mağazasına girdiniz. Bu mağaza sizin için ürünleri kategorilemiştir. Mağazadan içeri girdiğinizde Müzik ve Film kategorisi arasında seçiminizi yaparsınız önce. Daha sonra Film kategorisi içinden Bilim-Kurgu kategorisini bulur, oradan da aradığınız filme ulaşırsınız. Bir de bilimsel bir örnek verelim, bilim adamlarının bir çoğu, uzman oldukları alanlarda, genelleme ve özelleştirme yaparlar (Bu noktada inheritance konusunu bilen/duyan bazı arkadaşlar, biyologların canlı-hayvan-memeli-maymun kategorisi gibi bir örnek vereceğimi sanıyorlar ama yanılıyorlar ). Örneğin dil bilimciler (yaaa demedim mi ben?), dünya dillerini üç kategoriye ayırırlar (Tek heceliler,sondan eklemeli diller ve çekimli diller ). Yani genellerler. Ama bir genelleme aynı zamanda özelleştirmedir de, Gidiş yönünüze göre değişir.
Biz de; programlarımızda, bazı nesneleri kategorize etmek isteyebiliriz değil mi? İşte o zaman inheritance'in nimetlerinden faydalanıyoruz. Peki teknik olarak inheritance bize ne katıyor? Gelelim o konuya...
Class'lar arası inheritance uygulamamızın en makul sebebi, "kod maliyetini azaltmak" (yani daha az kod yazmak ) olacaktır. Biraz daha açmak gerekirse; birbirleriyle benzer classları ayrı ayrı yazmak yerine, ortak üyeleri belirleyerek bir base class oluşturmak ve geri kalanlarını bu base'den türetmek çok daha pratik bir çözüm olacaktır.
Biliyorsunuz ki .NET'de tüm tipler object'den türer. Burada bahsedilen türeme de, inheritance konusuna işaret etmektedir. Aşağıdaki resimde object tipinde bir değişkenin metodlarını görmektesiniz: 

Peki, inheritance konusunda söylediğim doğruysa ve tüm tipler bu object'den türüyorsa, herhangi bir .NET tipinde de, object metodlarını bulabilmeliyim değil mi? 



İşte kanıt! Dilerseniz, siz de başka tipler ile bu testi yapabilirsiniz.
Tamam, .NET kütüphanesinde tüm tiplerin, object tipinden türediğini gözlerimizle gördük. Şimdi sıra kendi tiplerimiz arasında miras uygulamaya geldi.
Aslında bunu yapmadan önce türeten – türetilen ilişkisinin (base-derived) nasıl modellenebileceği konusunda biraz konuşmak istiyorum. Kimin base kimin derived olduğuna nasıl karar vereceğiz? Cevap çok basit! Nesneler arasında, bir tanımlama cümlesi kurabiliyorsanız, aralarında inheritance ilişkisi var demektir. Örneğin:
"Pırasa bir sebzedir" cümlesi, bir tanımlama cümlesidir. Burada iki nesne bulunuyor, "pırasa" ve "sebze". Demek ki sebze base class, pırasa ise derived class olacaktır. Bir başka bir örnek daha, "Kamyonet bir arabadır". Dayanamayacağım bir örnek daha vereceğim, "Yazılım eğitmeni bir eğitmendir" ( Bu yaklaşım, ingilizce "... is a ..." relationship olarak bilinir. Türkçesi biraz komik duruyor: ... bir .... 'dir. ).
Biz modellememizde, bir restoranın kullanacağı bir yazılımda yer alacak olan class'lar arasında inheritance uygulayacağız. Bir müşteri, restorana gittiğinde masasında hangi çeşitler olur?
Genelleyelim; Yemek, içecek ve tatlı. Şimdi bunları özelleştirelim. Yemek; Et Yemekleri, ara sıcaklar, sulu yemekler. İçecek; alkollü, alkolsüz. Formülümüzü uygulayalım, "Et yemeği (derived) bir yemektir(base)".
Ohh... Anlattım rahatladım. Hadi yazalım şunu! 

 İşte yemek class'ım hazır. Şimdi, derived class oluşturalım: 

Şişman adam'dan ancak bu kod beklenirdi zaten! Nasıl miras aldığıma dikkat edin; class isminin yanında ':' işareti ve ardından base classımın adı. Peki ne elde ettik? Görelim:  

 

İşte bu! Yemek class'ı içinde yazmış olduğum metod ve özelliklerin tamamı EtYemekleri class'ı na aktarıldı. Böylece ortak olan alanları, genelleme yoluyla ayırabilir ve yemek class'ından istediğim kadar class türetebilirim...
Gördüğünüz gibi dostlarım, nesneler arası ortak olan metodları, özellikleri ve olayları bir base class altında toplayarak; düzenli bir modelleme oluşturdum. Şimdi kavramı daha da iyi anlayabilmek adına, Windows Application platformundan bir örnek vermek istiyorum. Biliyorsunuz ki, Form nesnesi üzerinde bir çok kontrol (TextBox,Button,Label vs.) kullanabilirim. Bu kontrollerin tümünde varolan bazı özellikler var. Mesela, BackgroundColor, Text, ForeColor bunlardan sadece bir kaçı. Bakın Microsoft ne yapmış? Bu ortak özelliklerin tümünü, Control diye bir class içinde toplamış. Sonra Button, Label, TextBox gibi kontrollerin tümünü bu Control classından türetmiş. İşte, bizim de yaptığımız tam olarak böyle bir modelleme...
Söz modellemeye gelmişken, küçük ve güzel bir ipucu vermek istiyorum. Bazen nesneleri görerek tasarlamak işimizi çok kolaylaştırır. Bakın, Visual Studio'da bizim için çok kullanışlı bir class diagram alanı var. Gelin, bir göz atalım: 


Solution Explorer penceresinden Projeye sağ tıklatıp açılan menüden View Class Diagram seçeneğini işaretlerseniz, projedek class'larınızın görsel tasarımını görürsünüz. Ben biraz temizlik yapıp aşağıdaki görüntüyü elde ettim:  

 

Bu şekilde, modellemeyi görerek çalışmak, bazen çok daha eğlenceli/anlaşılır/pratik oluyor sevgili arkadaşlar. Kesinlikle tavsiye edilir.
Şimdi, dikkatinizi bir yere çekmek istiyorum... Eminim ki, bir çok okurum, Yemek isimli base class içinde yer alan SunumSekli metoduna dikkat etmişlerdir. İçeriğinde "mevsim yeşillikleri, yanında pilav ile" yazıyor. Peki, menümdeki tüm yemekler aynı şekilde mi sunulacak? Elbette ki hayır. Yani, bazı metodlar ve özellikler; base class'da yazıldıkları gibi kullanılmak zorunda değiller. Peki bu durumu nasıl düzelteceğiz? Her yemeğin bir SunumSekli() vardır ama bunların her birinin içeriği aynı olamaz. Base class'da bulunan Metodun ya da özelliğin, derived class içinde yeniden düzenlenmesi gerekebilir. İşte bu da, polymorphism (çok biçimlilik) konusuna giriyor. 

Kaynak:turkayurkmez.com

Nesne Yönelimli Programlama – 3 Constructor kavramı ve Class tasarımı

Bu makalemize bir soru ile başlayalım; nasıl oluyor da bir class' tan bir nesne türetebiliyoruz? Bu "türetme" işine kod tarafında baktığımızda en sık karşılaştığımız yöntem, "new" anahtar kelimesi kullanmaktır. Örneğin;
Ayakkabi pabuc = new Ayakkabi();
Örnekteki "new Ayakkabi()" kısmı, Ayakkabi class'ı içinde bulunan tüm üyeleri, pabuc isimli nesneye aktarır. Biz bu duruma Ayakkabi class'ından nesne türetmek ya da daha teknik bir ifadeyle instance almak diyoruz. Şimdi, işi biraz daha basit almak istiyorum. Aslında, nesne üretmenizi sağlayan şey class' ınızın içinde bulunan oluşturucu metot (constructor) dediğimiz üyedir.
Constructor, kesinlikle bir metottur. Ama herhangi bir değer döndüren metot değildir. Ya da void metot olarak da düşünülemez. Constructor, yalnızca üyesi bulunduğu class'dan nesne üretimi sırasında çalışacak olan metoddur. Bu durumda şunu söylemek çok yanlış olmayacaktır, classımdan nesne üretilirken; üyelerin varsayılan değerlerini ayarlamak için constructor kullanırım. Bakınız, Windows uygulaması geliştirirken hep gözümüzün önünde bulunan bir constructor'u inceleyelim şimdi…
Bildiğiniz gibi Windows Form'u aslında bir class. Bakalım bu class' ın bir constructor'u var mı?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
İşte orada! public Form1() ifadesi ile başlayan üye bizim constructor' ımız oluyor. Şimdi gelin bu tanımı biraz inceleyelim. Gördüğünüz gibi constructor' un erişim düzenleyicisi (Access Modifier) public. Çoğu constructor'un erişim düzenleyicisi public' tir. Bunun sebebi, elbette constructor'a class dışından erişilebilir olması gerektiğidir. ( Aksi halde, Form1 frm = new Form1 (); diye bir ifade yazamazdık.) Constructor tanımının bir diğer özelliği ise isminin class ismiyle aynı olmasıdır (Form1()). İşte object oriented modellemenin vaz geçilmezi constructor ile böylece tanışmış olduk.
Şimdi, aklınıza bir sorunun takıldığını hissediyorum. Şöyle ki, "geçtiğimiz OOP makalelerinde yazdığımız Ayakkabi class' ında constructor yazmadığımız halde pabuc nesnesini türetebilmiştik bu nasıl oldu?" Hemen cevaplayalım; Yazdığınız her class'ta varsayılan olarak bir constructor bulunur. Dolayısıyla, siz yalnızca varsayılan ayarları değiştirmek için constructor tanımlarsınız. Belki bu cevap kafanızda bir soru daha oluşmasına neden olacaktır; 'madem varsayılan olarak bir constructor zaten var o halde neden Form1 classı bir constructor içeriyor? ' bunun da cevabını hemen verelim; yukardaki örneğe dikkat ederseniz Form1() constructor'u içerisinde çağırılan InitializeComponent(); isimli bir metot var. Bu metot, Form1.Designer.cs dosyasında bulunan bir metottur ve görevi form üzerinde kullandığımız kontrolleri ve bu kontrollerin özelliklerini oluşturmaktır.
Şunu tekrar belirtelim; constructor, classdan instance alınırken çalışır ve amacı, class üyelerinizin değerlerini ayarlayak nesne referansına geçirir.
Şimdi gelin, bizim meşhur Ayakkabi class'ımıza bir constructor ekleyelim. Hemen kafamızda bir senaryo oluşturalım. Bir ayakkabıcıya gittiniz. Doğru ayakkabıyı alabilmek için, ayakabbıcının bilmesi gereken şey, kaç numara giydiğinizdir öyle değil mi? Sizin elde edeceğiniz ayakkabı nesnesi belirttiğiniz ayak numarasına bağlıdır öncelikle. Madem öyle, işte Ayakkabi class'ımızın constructor'u geliyor:
public Ayakkabi(byte ayakkabiNo)
{
numarasi = ayakkabiNo;
}
Ne mi yaptık? Artık Ayakkabi class'ından nesne üretirken sizden ayakkabiNo parametresinin değerini alacak. Ardından bu değeri class üyelerinden "numarasi" isimli alana (bkz. OOP2 Encapsulation) aktaracak. Böylece "Numarasi" özelliğinin değeri oluşmuş olacak. Haydi... Nesneyi üretirken görelim: 


private void Form1_Load(object sender, EventArgs e)
{
Ayakkabi pabuc = new Ayakkabi(44);
}
Görüldüğü gibi pabuc nesnemi üretirken artık numara parametresini girme zorunluluğum var. Şunu da belirtelim ki, constructor'un bir nevi metod olduğunu unutmayın. Bu demek oluyor ki, constructor'lar da overload edilebilirler.
Buradan anlaşılıyor ki, constructor yapısı class tasarımı için vazgeçilmez bir kavram. Aslında söz class tasarımına geldiğinde göre, biraz da bu konu üzerinde duralım.
Class tasarımı dediğimizde, o classı oluşturan üyelerin neler olacağı ve nasıl çalışacağı üzerinde kafa patlatmaktan bahsediyoruz. Doğru tasarlanmış bir class, programcıya çok daha yardımcı olacaktır. Tasarıma ilk olarak, özelliklere ve bu özelliklerin tiplerine karar vererek başlarsınız. Bir özelliğe karar verirken ele aldığınız kriter ilk olarak o özellikle ne yapacağınızdır. Örneğin bizim class'ımızda malzemesi, markasi ve tipi özellikleri arama yapmak için kullanılabilir mi? Evet kullanılabilir. O halde bu özelliklerin tipleri ne olmalıdır? Aklınıza "string" geldiğini hisseder gibiyim. O zaman izninizle biraz kafanızı karıştırmak istiyorum.
Markasi özelliğinin tipini "string" yapmaya karar verdiniz. Sonra kodlama aşamasına geçtiniz ve "Adidas", "Nike" ile "Camel" markalarından olmak üzere üç farklı nesne ürettiniz. Buraya kadar tamam. Şimdi de bir MarkayaGoreAra metodu yazdınız ve doğal olarak parametresi de string tipinde. Bu metodu test ediyorsunuz; MarkayaGoreAra("adidas"); yazdığınızda sonuç bulunur mu? Efendim? Bulunur mu dediniz? Üzgünüm yanlış cevap. Sonuç bulunamaz. Ben "Adidas" markalı bir ayakkabı oluşturdum, "adidas" değil. Unutmayın.. case sensitivity öldürür!!
Peki o zaman ne yapacağız? Markasi özelliğinin tipi string olmazsa ne olacak? Acaba kendi tipimizi yapsak nasıl olur? Öyle bir tip yazalım ki, sattığımız ayakkabi markalarını üye olarak içersin. Bu cümleyi okuyan bazı arkadaşlarım enum'dan bahsettiğimi hemen anlayacaklardır. Eğer, belli değerler arasında sınırları olan (Örneğimizde; yalnızca "Adidas", "Nike" ile "Camel" markaları seçilebilecektir.) tipler oluşturmak istiyorsak enum olarak isimlendirdiğimiz yapıları kullanıyoruz. Hemen bunu örneğimiz üzerinde uygulayarak görelim.
Projemize sağ click / Add / Class diyelim ve "Enums" isimli bir fiziksel dosya ekleyelim. Ardından açılan dosyada namespace alanı içindeki tüm kodları temizleyelim... Ops! Bunu neden mi yaptık? Elbette oluşturacağımız enum tipini farklı fiziksel dosyada tutmak için... Şimdi buraya enum tipimizi yazalım:
public enum MarkaIsimleri
{
Adidas,
Nike,
Camel
}
İşte kendi value-type' ımızı oluşturduk. Şimdi Ayakkabi class'ı içinde bulunan Markasi özelliğini kendi tipimizle tekrar oluşturalım:
public MarkaIsimleri Markasi { get; set; }
Böylece artık Markasi özelliğine değer aktarırken, belirttiğimiz alanlardan değer seçme özgürlüğüne sahip olacağız. Haydi bunun da fotoğrafını çekelim: 


Ya arkadaş, bir programcı daha ne ister? Resmen MarkaIsimleri tipim beni yönlendiriyor: "kardeşim senin sattığın markalar bunlar, seç birini". Şimdi yukarıda oluşturduğumuz ayyakkabı arama senaryosuna geri dönelim. Artık MarkayaGoreAra metodunuzun parametresi string değil MarkaIsimleri tipinde olacaktır ve doğal olarak siz bu metodu şöyle çağırabileceksiniz; MarkayaGoreAra(MarkaIsimleri.Adidas); . Bakınız güzel bir class tasarlayarak, kendinize iyilik yaptınız. Şimdi class' imizdaki diğer bazı özellikler için de birer enum yazalım ve ardından Markasi özelliğinde yaptığımız gibi, söz konusu özellikleri yeniden oluşturalım.
Enums.cs :
public enum AyakkabiTipleri
{
Bot,
Çizme,
SporAyakkabi,
Sandalet
}
public enum MalzemeTipleri
{
Nubuk,
Deri,
Suet
}
Ayakkabi.cs:
public AyakkabiTipleri AyakkabiTipi { get; set; }
public MalzemeTipleri Malzemesi { get; set; }
Böylece, basitçe class modelleme konusuna değinmiş olduk. Modelleme konusu elbette bu kadarla sınırlı kalmıyor. Ama konuyu başka makalelere bırakıyorum.
Burada isterseniz constructor konusuna geri dönelim... En son, constructor yapısının da overload edilebileceğini belirtmiştim. O zaman yapalım!
Bir müşteri ayakkabıcıya girdiğinde, "42 numara spor ayakkabı istiyorum" ya da "42 numara deri çizme istiyorum" diyebilir değil mi? İşte bu parametreleri değerlendirerek Ayakkabi class'inin constructor metodunu overload edelim.
public Ayakkabi(byte ayakkabiNo, MarkaIsimleri marka)
{
numarasi = ayakkabiNo;
Markasi = marka;
}
public Ayakkabi(byte ayakkabiNo, MarkaIsimleri marka, MalzemeTipleri malzeme)
{
numarasi = ayakkabiNo;
Markasi = marka;
Malzemesi = malzeme;
}
Eh artık bunun da fotoğrafını çekmek bir zaruret: 




Yazar:Türkay Ürkmez
Kaynak:turkayurkmez.com