2 Şubat 2017 Perşembe

Kuantum Bilgisayarı

Kuantum bilgisayarı nedir? Nasıl yapılır? Evde kuantum bilgisayarı nasıl yapılır? İkinci el kuantum bilgisayarı alırken nelere dikkat etmeliyiz? Güzel olurdu dimi? Ama maalesef bu yazı o şekilde ilerlemiyor, şu şekilde ilerliyor;

Kuantum bilgisayarı özetle 'kuantum mekaniği yasalarına" göre çalışan bir bilgisayar sistemidir. Kullanmakta olduğumuz kişisel bilgisayarlara göre birçok açıdan farklılık gösterir. Bildiğiniz gibi bizim makineler bit diye bildiğimiz haberleşme ve depolama birimlerini kullanmaktadır. Bit'ler söz konusu olduğunda,bir cihaz ya da fiziksel bir sistem tarafından depolanabilecek bilginin maksimum değeri normal olarak sadece 2 farklı şekilde bulunabilir. 

Basitce bahsedersek, bir kapasitörün yüklü veya yüksüz olmasına göre, bir birimini 0 veya 1  durumlarından birinde olarak değerlendiririz. Fakat, kuantum bilgisayarlarında bit yerine q-bit (yada qubit)ler işlem görür.

Nedir q-bit?

Kuantum mekaniği yasalarına göre iki düzeyli sayılabilecek tüm sistemlerin q-bit bilgi taşıdığı söylenebilir. Yine aynı yasaların üst üste gelme (süperpozisyon) prensibi, bir q-bit'in hem 0 hem de 1 durumunu belirtir. 

Süperpozisyon prensibine değinmek için bir zar örneği verelim. Normalde zar atılmadan önce her bir sayının gelme olasılığı 1/6 dır diye düşünürüz. Bu prensipte ise zardaki altı durumun sanki altı zar atılmış gibi mevcut olduğunu, zara baktığımız anda beş durumun birden kaybolup da tek durumu gördüğümüzü düşünmek gerekir. Yani bir q-bit sadece 1 ve 0 değil, 1,0,10 ve 10 durumlarını barındırabilir.Genel olarak n q-bit sahibi bir kuantum bilgisayarı 2^n  farklı durumda olabilir.

Kuantum bilgisayarlarda süper iletkenler veya optik kablolar vasıtasıyla fotonlar q-bit birimi olarak kullanılabilmektedir.

Q-bitlerin süperpozisyon durumu, süper iletkenler veya optik kabloların sağlın sağladığı hız, normal bir bilgisayar ile kıyaslanamayacak kadar büyüktür.

Çok güçlü bilgisayalarla bile aylar sürecek bir şifre kırma işlemi, kuantum bilgisayarı ve uygun algoritma sayesinde saniyeden daha kısa sürede tamamlanabilir.

Google ve IBM gibi güçlü şirketlerde kuantum bilgisayarları bulunuyor. Maalesef kullanımı öyle bizim bilgisayarlar gibi kolay ve ucuz değil. Öncelikle çözülmek istenen problem için algoritma geliştirilmesi gerekiyor. 

Kuantum bilgisayarlarının kullanım alanları şimdilik çok geniş değil.

D-Wave isimli bir firma bu işe girişmiş ve optimizasyon,simulasyon, nesne algılama, video sıkıştırma gibi işler için kullanılabileceğini belirtmiştir.


Yine de kuantum bilgisayarının hesapladığı verilerin tercümesi için normal bir bilgisayar kullanılıyor.

Aman ben de alayım bir tane eve koyayım da komşunun wi-fi şifresini patlatayım diye düşünen arkadaşlara kötü haber, o iş öyle ucuz değil. 

Ayrıca bilgisayarın çalışma ortamında havanın vakumlanması gerekiyor çünkü havanın içerdiği gaz molekülleri geçici olarak işleme dahil oluphesaplama hatalarına yol açabiliyor. Soğutma için sıvı nitrojen, helyum gibi gazlar kullanılıyor. Bu sistemleri bir araya getirince oldukca alan kaplayan koca koca  ve gürültülü kabinler canlanıyor insanın gözünde.
Mesela kodlama yapayım şunda diyemiyorsunuz, çünkü sistem sabit değil.
Sabit değil derken, mesela 0 değerinde bir bit yok, ne olduğunu gözlemleyemeyeceğimiz bir q-bit var, dolayısıyla debug diye bir imkan da yok :)

Gelecekte kuantum bilgisayarların yaygınlaşması bekleniyor ama bu demek değil ki bizim emektar makineleri unutacağız.Bilgisayar teknolojisi gelişimine devam edecek fakat yüksek veri işlem hızı gerektiren işler için kuantum bilgisayarları kullanılacaktır.

Dilerseniz aşağıdaki videodan IBM’in kuantum araştırma laboratuvarına göz atabilirsiniz.



Veya bir algoritma örneği ile ilgili videolar ve kendi algoritmanız üzerinde çalışma imkanı veren IBM'in sitesine de bakabilirsiniz. 

Referanslar 

·       C.H Bennett - Quantum Information And Computation, 1995
  
    Gökhan KAPLAN

19 Ocak 2017 Perşembe

Verimli Çalışma Tekniği : Pomodoro

Belki hepimizin ortak tek problemi zamanimizi verimli kullanamamak. Buna bir çok sebep var. Ortamdaki gürültü, çalan telefon, gelen sorular, aklımıza takılan herhangi bir şey, her türlü sosyal medyaya bağlı olan telefonumuzun sürekli ışık çıkarması ... Bu kadar dikkat dağıtan şey arasında odaklanamıyoruz. Tamamen bunlar gibi problemler için üretilmiş bir teknik pomodoro.


Bu tekniğin adı tekniği bulan Francesco Cirillo 'nun mutfağındaki domates şeklindeki zamanlayıcıdan gelmiş. Zaten pomodoro İtalyanca domates anlamına geliyor. Francesco'nun ders çalışmayla ilgili problemleri varmış. Bu problemlerin ana nedeninin çevresinde çok fazla dikkatdağıtan şey  olduğunu ve kafasının karışıklığından ileri geldiğini düşünmüş. Bunu çözmek için kendi kendine şu soruyu sormuş. 10 dakika boyunca gerçekten çalışabilir misin ama gerçekten? Bunun için bir zamanlayıcıya ihtiyacı varmış ve domates şeklindeki mutfak zamanlayıcısını bulmuş. 

Nasıl çalışıyor?

Bu iş için öncelikle bir zamanlayıcıya ihtiyacımız var. Telefonumuz olabilir uygulamalar internet siteleri vs herhangi birşey.
Zamanlayıcımızı 25 dakikaya kuruyoruz. Ve 25 dakika boyunca hiçbirşeyin bizim dikkatimizi dağıtmasına izin vermiyoruz. Burası en önemli kısım. 25 dakika boyunca o işe odaklanmalıyız. Sonrasında da 5 dakikalık bir mola veriyoruz. O molada da kesinlikle o işle ilgili düşünmemeliyiz. Kafamızı dağıyacak her şey olabilir. Sosyal medya, küçük bir oyun, arkadaşımızla sohbet, komik bir video ne olursa.
Boylece 1 pomodoro yapmış olduk.
1 Pomodoro = 25 dk + 5dk dinlenme = 30 dk
4 Pomodoro dan yani 2 saatten sonrada 20 yada 30 dakikalık bir ara veriyoruz.

Nasıl etkiliyor?
  • Aslında işimizi 25 dakikalık parçalara böldüğümüz için yapacağımız şeyi küçülterek daha iyi yönetmemizi sağlıyor. (Divide and conquer)
  • Neyi ne kadar sürede yapabileceğimizi daha iyi tahminlememize yol açıyor. Tümevarım yapabiliyoruz.
  • Bölünmeleri tamamen yok ediyor. Ve o konunun en fazla ertelenme suresi 25 dakika. Ama bölünmediğimiz için tekrar odaklanmak zorunda kalmıyoruz ve onun vaktini kaybetmiyoruz.

Açıkçası ben program kullanmadan işin başında göz ucuyla saate bakarak bunu uyguluyorum. İlk başta uygulamalardan ya da siteler üzerinden zaman tutmaya başlamıştım. Ancak uyguladıkça bu şekilde psikolojik bir çalışma ritminiz oluyor ve şu an zamanlayıcıya veya saate bile ihtiyaç olmadan bu şekilde çalışabiliyorum. Farki şöyle anlatabilirim; uyguladığım günlerde gün sonunda hiç bir yorgunluk hissetmeden çok güzel işler çıkarmış oluyorum. Verimli bir gün geçiyor. Uygulayamadığım günlerde - genellikle "acil" konseptli işler olup düzenim bozulduğunda - ortaya pek birşey çıkaramamış, verimsiz bir gün geçirmiş oluyorum. Üstüne gün sonunda yorgunluktan kaynaklı sağlık problemleride oluşabiliyor.
Kısacası arkadaşlar domates güzel birşey. Uygulayın uygulatın. :)


Browser üzerinden takip için : https://tomato-timer.com

Ekin KUTLU

Cloud Computing (Bulut Bilişim)

Bilgisayarlar ve diğer cihazlar için, uygulama , program ve  verilerin bulutta depolanıp,  istenildiği zaman bu verilere ulaşılabilen internet tabanlı bilişim hizmetlerine Bulut Bilişim (Cloud Computing) denir. 

Bulut bilişim bu yönüyle bir ürün değil bir hizmettir.

Daha basit bir anlatım ile ihtiyacımız olan her türlü doküman ve dosyanın her yerden 
ulaşılabilir olmasını sağlayan bilgisayar anlamına geliyor. Tek bir sunucuda toplanan bilgi, belge, sunum, dosyaların internetin var olduğu her yerden ulaşılabilir olması anlamına geliyor. Bu sayede firmalar daha esnek bir yapıya sahip oluyorlar. 

Sadece firmalar için değil, kişisel veri ve belgelerin her yerden ulaşılabilir olmasını mümkün kılan bulut bilişim hizmetleri, hardisk ve harici taşıyıcılar gibi malzeme gereksinimlerinin ortadan kalkmasını sağlıyor.

Bulut bilişim fikrinin temelleri 1950’li yıllarda atılmıştır. İnternet devlerinden olan Amazon, veri merkezlerini modernize ederek bulut bilişimin gelişmesinde anahtar bir rol oynayarak ilk gerçek bulut bilişim hizmeti olan Amazon S3’ün 2006 yılında hizmete girmesini sağladı.  2008’in ortalarına gelindiğinde, Gartner (Danışmanlık ve Araştırma Şirketi) bulut bilişimi bilgi teknoloji hizmetleri sektöründe hem kullanıcılar hem de tedarikçiler arasındaki ilişkiyi değiştirebilecek potansiyeli işaret etti. 2008 den bu yana Dünya’da yaygın bir şekilde kullanılmaya başlandı. Son birkaç yıldır ülkemizde yaygınlaşan bu teknoloji  oldukça hızlı bir şekilde büyümeye devam ediyor.

Günümüz teknolojisinde ki mevcut cihazlarda kullanıcılar her geçen gün daha fazla kişisel veri ve data saklamak istediği için barındırma kapasitesi büyük sorunlara sebep olmaktadır. Bununla birlikte cihazların özellikleri, kapasiteleri gittikçe artıyor. Bilgisayar, notebook, netbook, ve taşınabilir akıllı cihazların teknoloji ve kapasitesinin artmasıyla orantılı olarak fiyatlar da yükseliyor. Tüm bu sorunlara çözüm olarak ortaya çıkan Bulut (Cloud) Teknolojisi, internet üzerinden, erişimde bulunulan yazılım uygulamaları, veri depolama hizmeti ve işlem kapasitesi olarak tanımlanmaktadır. En düşük kapasiteli cihazla bile istenilen yerden istenildiği zaman her tür bilgiye, kişisel veriye ulaşmayı sağlıyor. Tüm bu işlemler için, dijital bir ağ aracılığıyla çoklu sunucu bağlantısı gerçekleştiriyor. Bulut teknolojisinin üç yapıtaşı vardır. Bunlar SaaS (Software as a Service) yazılımı servis olarak sunma, PaaS (Platform as a Service) platform hizmeti  ve IaaS’tır (Infrastructure as a Service); sunucu altyapı hizmeti.

Software as a Services (SaaS

Kullanıcıların ihtiyaç duyduğu CRM, ERP, finans ve muhasebe yazılımları gibi programları bulut üzerinde çalışmasını sağlar.

Farklı lokasyonlarda faaliyet gösteren firmalar için SaaS ekstra yazılım maliyeti oluşturmayarak ciddi ekonomik avantaj sağlar. SaaS için en uygun örnek Gmail’dir. Google’ın sunduğu bu hizmet ile mail gönderebilir, dokümanlarınızı düzenleyebilir ve dosyalarınızı yedekleyebilirsiniz. 

Yazılım bilginiz olmasa dahi tüm işlemlerinizi gerçekleştirebilirsiniz.

Platform as a Service (PaaS)

Uygulama geliştiricilere donanım ve yazılım katmanları sunarak projelerini geliştirme imkanı sağlar.

Bu hizmet sistem yönetimi, işletim sistemi, programlama dili ortamı, veri tabanı vs. gibi platformlar sunar. Sistem yönetimi hizmet sağlayıcı tarafından gerçekleştirildiği için siz sadece uygulamaları ve verilerinizi yönetirsiniz. Örneğin PHP ile bir yazılım kodladınız. 

Kodladığınız yazılımın SQL ve web sunucu altyapısı ile uğraşmak zorunda kalmazsınız. PaaS, sadece yazılımınızın çalışması gereken platformları sağlar.

Infrastructure as a Service (IaaS)

Bulut Bilişim’in en temel hizmetidir. IaaS ile sanal sunucu oluşturulup kullanıcılara bulut sunucu hizmeti sunulmaktadır.

Bulut altyapısı ile sanal sunucu kaynakları size özel olarak tahsis edilir. IaaS ile esnek altyapıya sahip olursunuz. Örneğin tatil organize eden web sitelerinde tatil sezonlarının başlangıcına yakın sunucu kaynak ihtiyacı artar. 

Kullanılan kaynaklar, Bulut Bilişim’in esnek yapısından faydalanılarak istendiği zaman arttırılıp/azaltılabilir.

Bulut Teknolojisi’nin Getirdiği Avantajlar

►Bulut bilişim sistemleri API’ler ile hızlı kullanım kolaylığı sağlıyor.
►Daha fazla depolama alanı, hızlı veri transferi ve bu yedekleme üzerinde maliyet tasarrufu yapabilme gibi bir takım olanaklar sağlıyor.
►Sürekli olarak artan verilerin arşivlenmesi, kullanıcıların yetki ve takibi gibi konuların oluşturduğu alt yapı karmaşası ortadan kalkıyor.
►Bulut teknolojisi yazılımları web tarayıcıları üzerinden çalıştığından, bilgisayar, tablet, akıllı telefon ve  Smart TV'ler de kullanılarak platform bağımlılığından koruyor.
►Bulut yazılım hizmetini veren şirketlerin  verilerinin tutulduğu serverları 7/24 yazılım ve donanımsal olarak güvenlik tedbirlerini aldıklarından dolayı ana bilgisayardan daha güvenlidir.

Bulut Teknolojisi’nin Dezavantajları

►Ülkelerin ekonomik durumlarından dolayı dijital bölünmeyi arttıracak, bu da uluslararası, politik ve ekonomik sorunlar doğuracaktır.
►En önemli sorun ise depolanan verilere ulaşılabilmesi için internet bağlantısının olması gerekmektedir. Yani internet olmayan durumlarda bilgilerimize erişmek söz konusu değildir. İnternete bağlı olarak düşük hızlı internete sahipseniz veri alış-veriş hızınız da o derecede daha yavaş olacaktır.
►Bulut teknolojisi servisi kullanarak veri saklanması, kullanıcının verilerini riske atması bilgi güvenliğini ve kullanıcı gizliliğini sağlayamamaktadır. Güvenlik açıkları oldukça fazladır.
►Hizmetlerinin gelişmesiyle birlikte donanımsal ve yazılımsal bakım ve tamir maliyetlerinin azalacak olması ve buna bağlı olarak da bu işi yapan Bilgi Teknolojisi (BT) uzmanlarının iş sahalarının daralması durumu da son dezavantajlardan birisidir.
Bulut Bilişim’in Geliştirme Modelleri
Dört ayrı çeşidi ile karşımıza çıkan bu teknoloji  farklı alanlarda,farklı biçimlerde kullanılmaya olanak sağlıyor.
Public Cloud (Genel Bulut)
İnternet üzerindeki sunucular ile kurulan bir bulut teknolojisi. Küçük ve orta ölçekli şirketlerde kullanacağınız kullandığınız kadar ödeme yapılan  bu modele örnek olarak, elektronik postalar gösterilebilir.

Private Cloud (Özel Bulut)
Bilgileri önemli olan büyük şirketlerin tercih ettiği bir bulut teknolojisidir. Tüm bilgiler kurucunun elinin altındadır ve erişim güvenliği  ve gizliliği yüksektir. Microsoft bunu size Hyper-V ve System Center Ürün Ailesi yardımı ile sağlamaktadır.

Hybrid Cloud (Melez Bulut)
Public ve Private Cloud’un birleşiminden ortaya çıkan bulut teknolojisidir.Şirketlerin hacmine göre birleşim oranlarında farklılıklar görülebiliyor.
Community Cloud (Topluluk Bulut)
Birkaç şirket ile ortak kullanılan hizmetleri barındıran bulut teknolojisidir. Topluluk üyeleri uygulama ve verilere erişebilmektedir.

Bulut Teknolojisi Hizmeti Veren Platformlar

►Dropbox (
http://dropbox.com)
►Google Drive (http://drive.google.com)
►Yandex.Disk (http://disk.yandex.com)
►Turkcell Akıllı Bulut (http://turkcellakillibulut.com)
►TTNET Bulut (http://ttnetbulutu.com)
►Ubuntu One (https://one.ubuntu.com)

Bulut Bilişim Uygulamaları

Karelport.com: Bulut üzerinden hizmetler, fırsatlar ve sosyal paylaşım olanakları sunan online iş çevresi 
Amazon Elastic Compute Cloud (Amazon EC2): Ölçeklenebilir ve kullanım kapasitesi kadar ücretleme yapılan Amazon.com’un bulut işlem gücü servisi
Fizy.com: Bulut üzerinde müzik dinleme servisi
Google Apps: Ofis, veri ve iletişim amaçlı online uygulamalar
Salesforce.com: Salesforce’un müşteri ilişkileri yönetimi (CRM) servisi
Sade Arge: IOT Cloud çözümleri

Referanslar 

  Hasan BOYACI

Yazılım Hata Yönetimi

Her yazılımcının hayalidir hatasız program yazmak. Ama bu sadece teoride mümkün olabilir, gerek platform, gerek analiz, gerek test, gerekse kodlamaya dayalı hata çıkabilme oranı %50 seviyelerindedir.  

Yazılım sektöründe  hatalara genel olarak BUG adı verilir. 

BUG kelimesinin tarihçesinin bilgisayarların bir oda kadar olduğu zamanlarda o odalarda görülen gerçek böceklere dayandığını bilmek belki bir nebze olsun sizi rahatlatacaktır.

Hayal edilen hatasız program yazmak olsada birçok hata çıkabileceğini de göz önünde bulundurmak gerekir. Yine de amaç daha az hata çıkmasını sağlamak, çıkan hatalara da kısa sürede çözüm sağlayabilmek olmalıdır. Hata neden çıkar? ya da Hata çıktığında nasıl bir yol izlemek gerekir? bilgisi programcının kodlama kalitesini arttıracağı gibi uygulamanın başarısını da arttırır.

Bug oluşumunun birçok sebebi olduğu halde genel nedenleri aşağıdaki şekilde sıralanabilir;

Önce kodla sonra düşün yaklaşımı:

Çoğu zaman, ihtiyacın analizine yeterli zaman ayrılmadığında/ayrılamadığında karşılaşılan durumdur. Kodlama yapılırken hatta sonuna doğru çok fazla değişiklik gerektirir, bazen işin en başına dönme durumları oluşur. Bu da hem kodlama süresini arttırırken hem de işin sonunda aslında istenilenden farklı bir uygulama çıkmasına sebep olabilir. Bu nedenle bir ihtiyacın analizi aslında işin temelini oluşturduğundan en önemli kısmıdır.

İhtiyacın yanlış çözümlenmesi ve/veya yanlış anlaşılması:

İhtiyaç net cümlelerle gerekirse ekran ekran, satır satır belirtilmediğinde, programlamayı yoruma açık hale getirmeye neden olacaktır. Bu da istenenden farklı bir uygulama çıkmasına veya zamanın boşa harcanmasına neden olabilir. Bu nedenle kodlamaya başlanmadan önce netleşmemiş bir adım olmaması çok elzemdir.

İhtiyacın mühendislik/modelleme aşamasına yeterince zaman ayırmamak ya da bu aşamanın atlanması:

Programlamaya başlamadan önce ihtiyacı düşüncede değerlendirmek , hatta onu kağıt üstüne dökmek, adım adım algoritmasını çıkarmak; o işte karşılaşabileceğiniz aksaklıkları, hataları önceden görmenizi sağlayacağı gibi işi bölümlemenizi sağlayarak kodlama süresini de kısaltacaktır. Bu da biten uygulamada çıkan hataları büyük oranda azaltır.

Değişkenlerin doğru kullanılmayışı:

İlk değerlerin atanmaması, taşmalara sebep olacak veri tiplerinin kullanılması, tip dönüşümlerinin kontrolsüz gerçekleştirilmesi, değişkenlerin gerektiğinde sıfırlanmamaları basit ve çoğu zaman atlanan kontroller olduğu halde uygulamada ilk ve çoğunluk hataların alınma sebepleridir.  

Girdilerin doğruluğunun sınanmaması:

Ekrandan girilebilecek ya da farklı sistemlerden gelen parametrelerin kontrol edilmeksizin ya da yeterince kontrol edilmeksizin kullanılması da hatalara sebebiyet verir. Bu aşamada yazılımcı kontrolleri yetersiz kalabileceğinden test ekibi tarafından ilk kontrol edilecek adımlardan olmalıdır.

Kodlamanın gerektiği kadar basitleştirilmemesi:

Birçok işi bir arada yapan süper fonksiyonların/nesnelerin kodlanması, yordamların çok uzun olması, katman ve görevlerin birbirlerinden yeterince ayrıştırılamaması kod akışının takibini zorlaştırdığı gibi, zamanla yordamın asıl amacından çıkılmasına neden olabilir. Bu nedenle yordamların en küçük iş bloklarına kadar ayrılmış olması hem işin takibini kolaylaştıracak, hem de ortak kullanıma daha uygun hale getirecektir. Bu da büyük projelerde kod kirliliğini önlerken, maliyeti de azaltır.

Hatanın neden çıktığı , nasıl önlenebileceği konuları sorunun kaynağını düzeltir. Fakat gerçek hayatta sadece kurallara uymak yeterli olmaz. 

Eski veya çok büyük bir projede çalışıyorsanız, projede çok sayıda kişi çalışıyorsa ya da projede çok sayıda modül varsa; tüm bu kurallara proje başlangıcından beri uyulmuyorsa hata çıkabilir. Ya da var olan bir projeye ekleme yaptığınızda kod etkileşimi varsa da öngöremediğiniz bir hatayla karşılabilirsiniz. Bu durumda hatayı önlemek kadar, var olan bir hatayı doğru ve hızlıca çözmek de en az hata yapmamak kadar önemlidir. 

Esin KAPUCU

27 Aralık 2016 Salı

Nesne Yönelimli Programlama(Object Oriented Programming) - 2

Bir önceki makalemizde nesne yönelimli programlama'da Encapsulation ve Classification konularını incelemiştik.


Bu makalemizde aşağıdaki konulara değineceğiz.
·         Inheritance
·         Polymorphism
·         Abstraction

INHERITANCE

Nedir bu miras almak yada kalıtım almak?

Biyolojiden de bildiğimiz üzere ailemizden bazı özelliklerimizi kalıtım alırız.Örneğin; babanızda mavi göz geni varsa sizin ve sizden sonraki çocukların mavi gözlü olma durumu vardır.Yani o geni taşıyabilirsiniz.Ama sizden önceki jenerasyonda hiç mavi göz geni yoksa siz ve sizden sonraki çocuklarda da bu genin olma olasılığı yoktur.
Kısacası OOP'deki inheritance özelliğide aynı bu duruma benzer.Inheritance kullanırken dikkat etmemiz gereken durum, bir nesne ancak bir nesneden miras alabilir.Miras alma durumunun en genel ve anlaşılır örneklerinden biri ise “Bir çocuğun sadece bir biyolojik babası olabilir ancak bir babanın birden fazla çocuğu olabilir.”
Şimdi kodumuzla örnekleyelim;
public class Aksesuar
 {
        public string UrunAdi { get; set;}
        public decimal UrunFiyati{ get;set;}
        public DateTime UretimTarihi{get;set;}
        public string Bilgi()
        {
            return string.Format("Bu ürünün üretim tarihi:{0}", this.UretimTarihi);
        }
 }

Burada bir Aksesuar nesnesi mevcut.Şimdi bir kitap ayracı nesnesi yapacağım.Kitap ayracı nesnesinin de; adı, fiyatı, üretimTarihi gibi özellikleri bulunur.Fakat bunun yanında bir de tip gibi bir özelliği olduğunu düşünelim.Dolayısıyla kitap ayracı aynı zamanda bir Aksesuar oldu. İşte nasıl miras aldığımızın bir örneği.
public class KitapAyraci:Aksesuar
{
  public string Tip { get; set; }
}
Şimdi arayüz kısmında KitapAyraci nesnesini kullanalım.Aşağıdaki örnekde olduğu üzere kitap ayracı nesnesi içine UrunAdi,UrunFiyati,UretimTarihi özellikleri de geldi.Ayrıca Tip özelliğide, sadece KitapAyraci nesnesine eklenmiştir.


POLYMORPHISM

Polymorphism çok biçimlilik anlamına gelmektedir.Aslında bunu çok sevdiğim tiyatro oyuncusu Genco Erkal ile örneklendirmek istiyorum.Hiç oyununu izledinizmi bilmiyorum ama ben hiç bir oyununu kaçırmam.Neyse olayımız  Genco Erkal’ın birden fazla tiyatro oyununda oynamakta olması ve her oyununda farklı karakterleri canlandırmasıdır.Yani oynadığı rol değişmektedir.Fakat o oyunun oyuncuları kısmında rolü ne olursa olsun kendi adı yazmaktadır.İşte çok biçimlilik budur.
OOP’de bir nesnedeki method yada property virtual olarak tanımlanarak miras verdiği diğer sınıflar içinde farklı davranışlar sergileyebilmektedir.
Aşağıdaki örneğimizde bir araç nesnesi bulunmaktadır.Bu nesne içinde VitesBilgisi methodu virtual tanımlanmıştır.Çünkü bu sınıftan türeteceğim diğer nesnelerin VitesBilgisi farklı olabilir.Default olarak 4 vites diyoruz.Eğer değilse o nesne içinde bu methodu eziyoruz.Yani yapacağı işi biçimlendiriyoruz.
public class Arac
 {
       public int TekerlekSayisi { get; set; }
       public string Marka { get; set; }

       //Burdaki method virtual tanımlandı.Bunun sebebi bu sınıftan miras alan sınıflarda       //bu methodun döndürebileceği değer o sınıflar içinde değişebilir.
       //Virtual sınıflar miras alınan sınıflarda ezilebilir olurlar.Yani methodun
       //yapacağı işler değişir.
       public virtual string VitesBilgisi()
       {
           return "Bu araçta 4 vites mevcuttur.";
       }
 }

Şimdi bu nesneden miras alan iki nesne yaratalım ve VitesBilgisi methodu için polymorphism uygulayalım.
public class Bisiklet:Arac
{
        public string KullaniciTipi { get; set; }
        public override string VitesBilgisi()
        {
            return "Bisiklet 16 vitestir.";
        }
}

Buradaki Bisiklet nesnesi Arac nesnesinden miras almıştır.Arac nesnesi içindeki VitesBilgisi methodu ezilerek geriye “Bisiklet 16 vitestir” mesajını döndürmektedir.Araba nesnesi için ise VitesBilgisi methodu “Bu araçta 4 vites mevcuttur.” mesajını döndürür.Yani bu method Araba sınıfında ezilmemiştir ve default olarak yapması gereken işi yapar.
public class Araba:Arac
 {
        public Color Renk { get; set; }
        public int KapiSayisi { get; set; }
        public bool HidrolikDireksiyon { get; set; }
 }

ABSTRACTION

Inheritance kullanırken uygulanabilecek bir yaklaşımdır.Abstraction uygulanacak sınıflara, instance alma işlemi uygulanamaz.Bu sınıflar sadece miras vermek için kullanılır.OOP’ye başlarken dünya üzerindeki her nesneyi düşünmek gerek demiştik.Malzeme de bir nesne olmasıyla birlikte soyut bir kavramdır aslında.”Neyin malzemesi?” diye düşünürüz kullanıldığı zaman.Malzeme denildiğinde aslında yemek yapmak için kullanılan malzemeler, mobilya yapmak için kullanılan malzemeler ve benzeri malzemeler akla gelmektedir.Yani malzeme tek başına çokta birşey ifade etmez.İşte biz bu tür nesneleri soyutlayarak kullanırız.Yani program içinde türetilebilir olmamaları için abstraction uygulanır.

Abstract sınıfların bazı özellikleri;
  • Instance alınamazlar.
  • Abstract kelimesi ile işaretlenirler.
  • Abstract sınıflar içinde oluşturulan abstract method’ların ve property’lerin ne yapacağı o sınıf içinde yazılmaz.Method ve property içleri boştur.Ve kime miras veriyorlarsa abstract yaratılan methodlar ve property’ler implemente edilmek zorundadırlar.(Yani miras verilen sınıfta ne iş için kullanıldığı mutlaka yazılmak zorundadır.)

Şimdi bu anlattıklarımızı örnekleyelim.İşletim sistemi nesnesi soyut bir kavramdır.”Hangi işletim sistemi?” sorusu aklımıza gelir.İşte Linux,Windows gibi nesnelerimizi işletim sistemi nesnesinden miras alarak kullanacağız.
 public abstract class IsletimSistemleri
 {
        protected abstract DateTime CikisTarihi { get; set; }
        public abstract string KarsilamaMesaji();
        //propected:Sadece bu sınıftan miras alınan sınıflar erişebilir
        protected string _versiyonBilgisi;
        public string VersiyonBilgisi
        {
            get { return _versiyonBilgisi; }
            set { _versiyonBilgisi = value; }

        }
 }
CikisTarihi property’si ve KarsilamaMesaji methodu abstract olarak tanımlandı.Bu yapılar her, işletim sistemi için farklılık gösterebileceğinden bu şekilde tanımlıyoruz.Şimdi bir sınıfa bu sınıftan miras verelim. Aşağıda ki Abstraction kullanımına dair örneği inceleyebilirsiniz.
 public class Linux:IsletimSistemleri
 {
        private string _ad = "Linux";
        public string AD
        {
            get { return _ad; }
        }
        private DateTime _cikisTarihi;
        protected override DateTime CikisTarihi
        {
            get
            {
                return _cikisTarihi;
            }
            set
            {
                if (value > DateTime.Today)
                    throw new Exception("Çıkış tarihi bugünden büyük olamaz.");
                else
                    _cikisTarihi = value;
            }
        }
        public override string KarsilamaMesaji()
        {
            return "Linux'e hoşgeldiniz";
        }
 }
Bir de Windows nesnesi eklenmiş şekilde class diagramında bu nesneyi görelim. 

Pelin KARACAN