1.
son tanımları
2.
işlemci
bu yazım ise kodlama yaparken mantığını anlamanız içindir;
bizim yazdığımız if, else, değil işareti şimdi daha anlamlı oldu değil mi? tüm yazdığımız kodlar bunlara dayandığı için tüm yazılım dilleri birbirlerine benziyor. ama eğer bir gün farklı bir şey eklenebilirse bu işlemcilere o zaman farklı bir şeyler göreceğiz. :)
bizim yazdığımız if, else, değil işareti şimdi daha anlamlı oldu değil mi? tüm yazdığımız kodlar bunlara dayandığı için tüm yazılım dilleri birbirlerine benziyor. ama eğer bir gün farklı bir şey eklenebilirse bu işlemcilere o zaman farklı bir şeyler göreceğiz. :)
devamını gör...
3.
işlemci
veri yolu 8 bit olan bir işlemciye 64 bitlik bir veri gönderildiğinde bilgiler 8 defada gönderilir. 64 bitlik veri yoluna sahip bir işlemciye ise 64 bitlik veri 1 defada gönderilir. çalışma frekansları aynı olsa bile 64 bitlik veri yoluna sahip işlemci 8 bitlik veri yoluna sahip işlemciden 8 kat daha hızlı çalışır.
çift çekirdekli işlemci tek bir fiziksel işlemci içinde aynı frekansta çalışan iki tam yürütme/çalıştırma biriminden (çekirdek) oluşur. her iki çekirdek de aynı paketi, aynı çipset ve belleği kullanır. iki çekirdeğin olması, aynı anda çoklu uygulama çalıştırma olanağı sağlar
eskiden işlemciler, anakarta sabitlenmiş olarak üretiliyordu. işlemci veya anakart arızalandığında onların birbirinden bağımsız olarak test veya tamir edilmesi mümkün olmuyordu. ayrıca var olan işlemciyi yenisiyle değiştirmek de zor oluyordu. bu nedenle işlemcinin anakarta takılıp sökülmesini sağlayan işlemci yuvaları geliştirildi.
intel'in 1971 de ürettiği ilk işlemci:
bu karmaşık şey 2300 transistör içeriyor. ( şimdilerde 2 milyara yakın!!!)
işlemcilerin kendine özel belleği vardır. l1, l2, l3 olarak adlandırılır. çok nadirde olsa l4 bellekler görüyoruz.
not: işbu anlattıklarım bilgisayar işlemcileri için geçerlidir. uçaklar gibi makinelerde işlemciler biraz daha farklılık gösterebilse dahi neuman modelini kullanırlar.
neuman modeli kullanmayan bir bilgisayar arıyorsanız sizi kuantum bilgisayarlara alalım. ama o başka bir başlığın konusu.
çift çekirdekli işlemci tek bir fiziksel işlemci içinde aynı frekansta çalışan iki tam yürütme/çalıştırma biriminden (çekirdek) oluşur. her iki çekirdek de aynı paketi, aynı çipset ve belleği kullanır. iki çekirdeğin olması, aynı anda çoklu uygulama çalıştırma olanağı sağlar
eskiden işlemciler, anakarta sabitlenmiş olarak üretiliyordu. işlemci veya anakart arızalandığında onların birbirinden bağımsız olarak test veya tamir edilmesi mümkün olmuyordu. ayrıca var olan işlemciyi yenisiyle değiştirmek de zor oluyordu. bu nedenle işlemcinin anakarta takılıp sökülmesini sağlayan işlemci yuvaları geliştirildi.
intel'in 1971 de ürettiği ilk işlemci:
bu karmaşık şey 2300 transistör içeriyor. ( şimdilerde 2 milyara yakın!!!)
işlemcilerin kendine özel belleği vardır. l1, l2, l3 olarak adlandırılır. çok nadirde olsa l4 bellekler görüyoruz.
not: işbu anlattıklarım bilgisayar işlemcileri için geçerlidir. uçaklar gibi makinelerde işlemciler biraz daha farklılık gösterebilse dahi neuman modelini kullanırlar.
neuman modeli kullanmayan bir bilgisayar arıyorsanız sizi kuantum bilgisayarlara alalım. ama o başka bir başlığın konusu.
devamını gör...
4.
single responsibility
solid geliştirmenin s harfidir.
her nesne sadece ama sadece bir işi yapmalıdır. bu bize yazılımda bağımlığı azaltır ve esnemeye olanak sağlar. yeni başlayan kişiler için kısaca bir fonksiyon toplama işlemi yapıyorsa sadece o işi yapmalıdır, bu kadar basit.
peki biraz daha ileri seviye geçersek?
1. web için konuşalım mesela gidip dataaccess içinde sql kodları yazmayın. adı üstünde data erişim katmanı, burada sadece datalara erişmeliyiz. eğer sql bir komut yazmak istersek bunu başka yerde yapmalıyız.
2. iş kodlarının içine kurallar yazmayın. kurallar validationrules içinde yazılmalıdır.
3. dependcyresolvers yaparken bunu webapı içinde yapmamalıyız. bu sağlıklı bir şey değil.
bu konu bu kadar kısa ve basit ama pratik gerektiriyor.
her nesne sadece ama sadece bir işi yapmalıdır. bu bize yazılımda bağımlığı azaltır ve esnemeye olanak sağlar. yeni başlayan kişiler için kısaca bir fonksiyon toplama işlemi yapıyorsa sadece o işi yapmalıdır, bu kadar basit.
peki biraz daha ileri seviye geçersek?
1. web için konuşalım mesela gidip dataaccess içinde sql kodları yazmayın. adı üstünde data erişim katmanı, burada sadece datalara erişmeliyiz. eğer sql bir komut yazmak istersek bunu başka yerde yapmalıyız.
2. iş kodlarının içine kurallar yazmayın. kurallar validationrules içinde yazılmalıdır.
3. dependcyresolvers yaparken bunu webapı içinde yapmamalıyız. bu sağlıklı bir şey değil.
bu konu bu kadar kısa ve basit ama pratik gerektiriyor.
devamını gör...
5.
open closed principle
solid prensiplerinin "o" harfine denk gelir.
yazdığımız kod gelişime açık değişime kapalı dersek cuk diye oturur. eğer yeni bir kod eklediğimizde mevcut projede kullandığımız kodu değiştiriyorsak open closed principle kurallarını bozmuş oluyoruz. peki mevcut kodlarımıza dokunmadan yeni kod nasıl eklenir?
c# dili için;
benim en pratik çözümüm interfacelerin, classların referansını tutabilmesini kullanmak. iş yapan fonksiyona interface gönderirsek, o interface implement ettiği sınıfların referansını tuttuğu için class hiyerarşisinden bağımsız polymorphisme izin verir. böylece o fonksiyona hangi class referansını yollarsak o class üzerinden çalışmaya başlar.
örnek kod:
gördüğünüz gibi sadece oluşturduğum class referansını veriyorum. böylece ilerde cserver eklersem sadece new cserver(); yazmam yeterli olacaktır.
yazdığımız kod gelişime açık değişime kapalı dersek cuk diye oturur. eğer yeni bir kod eklediğimizde mevcut projede kullandığımız kodu değiştiriyorsak open closed principle kurallarını bozmuş oluyoruz. peki mevcut kodlarımıza dokunmadan yeni kod nasıl eklenir?
c# dili için;
benim en pratik çözümüm interfacelerin, classların referansını tutabilmesini kullanmak. iş yapan fonksiyona interface gönderirsek, o interface implement ettiği sınıfların referansını tuttuğu için class hiyerarşisinden bağımsız polymorphisme izin verir. böylece o fonksiyona hangi class referansını yollarsak o class üzerinden çalışmaya başlar.
örnek kod:
gördüğünüz gibi sadece oluşturduğum class referansını veriyorum. böylece ilerde cserver eklersem sadece new cserver(); yazmam yeterli olacaktır.
devamını gör...
6.
liskov substitution
kısaca bahsetmek gerekirse anlamı şudur;
"alt sınıflardan oluşan nesnelerin, üst sınıfın nesneleri ile yer değiştirdikleri zaman, aynı davranışı sergilemesi gerekmektedir.".
böyle dedikten sonra bir kulaktan girip çıkıyor mu? haydi o zaman örnekler üzerinden anlatalım.
gördüğünüz gibi bir tane interface tanımladık ve insanların yapması gereken şeyleri tanımladık. insanlar yer, içer, uyur, cinsellik yapar.
şimdi buraya kadar çok güzel ama şimdi şöyle bir şey yapalım.
burada şişme bebek sınıfımız yemek yemeyeceği, içemeyeceği, uyuyamadığı için, burada yemek yeme, su içme ve uyuma gibi özelliklerimizi bir ınterface olarak tanımlayacağız.
yani "alt sınıflardan oluşan nesnelerin, üst sınıfın nesneleri ile yer değiştirdikleri zaman, aynı davranışı sergilemesi gerekmektedir.".
evet gördüğünüz gibi liskov substitution prensibine uyan bir tasarım yaptık. artık şişme bebeğimiz göze batmıyor.
not: aslında şişme bebek ilk baş çocuk olarak tasarlanmıştı ama yazarlar tarafından dikkat çekmesi için bunu daha doğru buldum. (yemek ye, su iç, uyu olarak tasarlandı tabi.)
evet, kafa sözlük yazarları. bugünkü konu anlatımız baya garip bir örnek oldu. kafalarımızda soru işareti kalmadığını düşünüyorum. kendinize iyi ve sağlıcakla bakın.
edit: şimdi şöyle sorular gelebilir;
bunun ınterface segregation ile farkı ne ki?
cevap : aslında mantık olarak aynıdır ama ;
liskov substitution : classın implement ettiği fonksiyonların işlevlerini yerine getirmelidir. yani kullanılmayacak şeyleri ayırmalısınız. bu yüzden genelde bu prensibe uymayan objelerin içi "throw notimplementedexception" olarak kalır. sen ne kadar zorlarsan zorla şişme bebek yemek yiyemez. yani içi boş kalır. ağzından tıksan bile yemek yeme işlevini yapamaz.
ınterface segregation : teknik olarak şişme bebeği uyutur gibi yapabilirsiniz. (zorlama kaçıyor değil mi?) işte burada interface segregation ihlali oluyor. zorlama olarak kullanılamayacak şeyler var. zorlama olarak uyumaya bağımlı yapıyorsunuz. gerek var mı? gerçekten şişme bebekler uyur mu?
aslında solid prensipleri birbirlerine çok benzer. mantığı bir kere kurdunuz mu, sizden iyisi yok.
yani aslında ınternet'te geçen kare ve dikdörtgen örneği bunun için çok uygun. dikdörtgeni iki kenarı ile hesaplayabilirsiniz ama kare için tek kenar yeterli. karenin iki kenarını alıyorsanız orada bir sorun vardır. yani tanımlamalarını çok düzgün yapmalısınız. dikdörtgen ile kare aynı şey değildir.
sen neden bunun üzerine anlatmadın? sorusunun cevabı çok basit, özgün olmak istedim.
"alt sınıflardan oluşan nesnelerin, üst sınıfın nesneleri ile yer değiştirdikleri zaman, aynı davranışı sergilemesi gerekmektedir.".
böyle dedikten sonra bir kulaktan girip çıkıyor mu? haydi o zaman örnekler üzerinden anlatalım.
gördüğünüz gibi bir tane interface tanımladık ve insanların yapması gereken şeyleri tanımladık. insanlar yer, içer, uyur, cinsellik yapar.
şimdi buraya kadar çok güzel ama şimdi şöyle bir şey yapalım.
burada şişme bebek sınıfımız yemek yemeyeceği, içemeyeceği, uyuyamadığı için, burada yemek yeme, su içme ve uyuma gibi özelliklerimizi bir ınterface olarak tanımlayacağız.
yani "alt sınıflardan oluşan nesnelerin, üst sınıfın nesneleri ile yer değiştirdikleri zaman, aynı davranışı sergilemesi gerekmektedir.".
evet gördüğünüz gibi liskov substitution prensibine uyan bir tasarım yaptık. artık şişme bebeğimiz göze batmıyor.
not: aslında şişme bebek ilk baş çocuk olarak tasarlanmıştı ama yazarlar tarafından dikkat çekmesi için bunu daha doğru buldum. (yemek ye, su iç, uyu olarak tasarlandı tabi.)
evet, kafa sözlük yazarları. bugünkü konu anlatımız baya garip bir örnek oldu. kafalarımızda soru işareti kalmadığını düşünüyorum. kendinize iyi ve sağlıcakla bakın.
edit: şimdi şöyle sorular gelebilir;
bunun ınterface segregation ile farkı ne ki?
cevap : aslında mantık olarak aynıdır ama ;
liskov substitution : classın implement ettiği fonksiyonların işlevlerini yerine getirmelidir. yani kullanılmayacak şeyleri ayırmalısınız. bu yüzden genelde bu prensibe uymayan objelerin içi "throw notimplementedexception" olarak kalır. sen ne kadar zorlarsan zorla şişme bebek yemek yiyemez. yani içi boş kalır. ağzından tıksan bile yemek yeme işlevini yapamaz.
ınterface segregation : teknik olarak şişme bebeği uyutur gibi yapabilirsiniz. (zorlama kaçıyor değil mi?) işte burada interface segregation ihlali oluyor. zorlama olarak kullanılamayacak şeyler var. zorlama olarak uyumaya bağımlı yapıyorsunuz. gerek var mı? gerçekten şişme bebekler uyur mu?
aslında solid prensipleri birbirlerine çok benzer. mantığı bir kere kurdunuz mu, sizden iyisi yok.
yani aslında ınternet'te geçen kare ve dikdörtgen örneği bunun için çok uygun. dikdörtgeni iki kenarı ile hesaplayabilirsiniz ama kare için tek kenar yeterli. karenin iki kenarını alıyorsanız orada bir sorun vardır. yani tanımlamalarını çok düzgün yapmalısınız. dikdörtgen ile kare aynı şey değildir.
sen neden bunun üzerine anlatmadın? sorusunun cevabı çok basit, özgün olmak istedim.
devamını gör...
7.
ınterface segregation
solid prensiplerinin i harfine karşılık gelir. bu prensip bize der ki eğer interfaceler'de implementasyon yapıldığında bir operasyon o implementasyon içinde kullanılmayacaksa, ayrıştırılmalıdır. bu yüzden biz projelerimizi ilk olarak interface kısmını oluşturuyoruz.
yani "throw new notimplementedexception()" görüyorsanız ve bu boş kalıyorsa o interface'yi orada kullanmak yanlıştır.
(b: örnek:)
public interface ıweapon{
void mermisayisi();
void vurusgucu();
void hizi();
}
public class tabanca : ıweapon
{
// içini sen doldur.
}
public class sword: ıweapon
{
// içini sen doldur.
}
yukarıda ki yazdığım kod hatalı bir kod. çünkü sword evet bir silah olsa bile boşu boşuna mermi sayısını dahil ediyorum. bu yüzden bu interfaceler ayrılmak zorundadır.
(b: yani şöyle olması lazım;)
public interface ıtabanca : ıweapon
{
void mermisayisi();
}
public interface ıweapon{
void vurusgucu();
void hizi();
}
public interface ısword : ıweapon
{
}
//
public class tabanca : ıtabanca
{
// içini sen doldur.
}
public class sword: ısword
{
// içini sen doldur.
}
gördüğünüz gibi her silahın bir vuruş gücü ve hızı vardır. ve sword ve tabanca bir silahtır. ama sword ve tabancanın özellikleri daha farklıdır. ayrıca yarın bir gün yeni silah ekleyeceğimiz zaman örneğin tüfek şöyle olmalıdır;
public interface ıtufek : ıweapon
{
// içini sen doldur.
}
gördüğünüz gibi sistemi çok güzel yaptım. yarın bütün silahlara ortak özellik eklesem sadece weapona interfacesine eklemem yeterli olacaktır gibi gibi. classlar zaten otomatik olarak bunu implement etmek zorunda kalacak. ya da sadece yakın dövüşe bir özellik eklemek istersen ısword interfacesine eklemem yeterli olacaktır.
eğer projeyi classlardan geliştirmeye başlasaydık işin içinden çıkmamız zor olurdu. bu prensibi uygulamanın en kolay yolu, projeye interfaceler ile başlamak olacaktır ki bence doğru olanı budur.
son olarak bu interfaceler gerçek bir oyun projesinde daha çok ayrılıyor. burada basit olsun diye kısa oldu. ama mantığını kavradığınızı düşünüyorum. basit bir konu, ama bence. hehe.
yani "throw new notimplementedexception()" görüyorsanız ve bu boş kalıyorsa o interface'yi orada kullanmak yanlıştır.
(b: örnek:)
public interface ıweapon{
void mermisayisi();
void vurusgucu();
void hizi();
}
public class tabanca : ıweapon
{
// içini sen doldur.
}
public class sword: ıweapon
{
// içini sen doldur.
}
yukarıda ki yazdığım kod hatalı bir kod. çünkü sword evet bir silah olsa bile boşu boşuna mermi sayısını dahil ediyorum. bu yüzden bu interfaceler ayrılmak zorundadır.
(b: yani şöyle olması lazım;)
public interface ıtabanca : ıweapon
{
void mermisayisi();
}
public interface ıweapon{
void vurusgucu();
void hizi();
}
public interface ısword : ıweapon
{
}
//
public class tabanca : ıtabanca
{
// içini sen doldur.
}
public class sword: ısword
{
// içini sen doldur.
}
gördüğünüz gibi her silahın bir vuruş gücü ve hızı vardır. ve sword ve tabanca bir silahtır. ama sword ve tabancanın özellikleri daha farklıdır. ayrıca yarın bir gün yeni silah ekleyeceğimiz zaman örneğin tüfek şöyle olmalıdır;
public interface ıtufek : ıweapon
{
// içini sen doldur.
}
gördüğünüz gibi sistemi çok güzel yaptım. yarın bütün silahlara ortak özellik eklesem sadece weapona interfacesine eklemem yeterli olacaktır gibi gibi. classlar zaten otomatik olarak bunu implement etmek zorunda kalacak. ya da sadece yakın dövüşe bir özellik eklemek istersen ısword interfacesine eklemem yeterli olacaktır.
eğer projeyi classlardan geliştirmeye başlasaydık işin içinden çıkmamız zor olurdu. bu prensibi uygulamanın en kolay yolu, projeye interfaceler ile başlamak olacaktır ki bence doğru olanı budur.
son olarak bu interfaceler gerçek bir oyun projesinde daha çok ayrılıyor. burada basit olsun diye kısa oldu. ama mantığını kavradığınızı düşünüyorum. basit bir konu, ama bence. hehe.
devamını gör...
8.
dependency inversion
solid programlama prensiplerinin d harfidir. özetlemek gerekirse yüksek seviyeli sınıfların düşük seviyeli sınıfları soyut halleriyle kullanmasıdır. bu da bağımlılığın düşmesini sağlamaktadır. eğer biz bunu somut olarak kullanırsak ilerde kodumuzun spagetti koda dönüşmesi çok olasıdır. ondan sonra yoldaş benjamin franklin gelip bizi fırçalaması içten bile değil.
haydi şimdi bunu nasıl kullanırız onu görelim.
öncelikle bir tane interface oluşturalım.
daha sonra bu interface bildiğiniz gibi onu implement eden sınıfların referansını tutar. daha doğrusu bunun için kullanırız. işte bu yüzden iki tane veri tabanı işlemlerini yapan class oluşturalım ve bunları implement ettirelim.
daha sonra custumer manager oluşturalım. burada constructor içinde dependency injection yaptım. yani artık bağımlılığımız dışardan parametre olarak geliyor. ve bu bağımlılık ıkafasozluksql intefacesini implement eden class olmak zorunda. yani artık bu gelen bağımlılıkta gelen şeyi istediğiniz gibi kodlayabilirsiniz. ilerde kodlarınızda değişiklik yapmadan yeni bir bağımlılık gönderebilirsiniz.
ama eğer biz bunu gevşek bağımlılık değil de, sıkı bağımlılık yapsaydık örnek olarak => kafasozlukmicrosoftserver server = new kafasozlukmicrosoftserver(); diye olsaydı server. add(); dediğimiz yerde biz "new kafasozlukmicrosoftserver();" bu oluşturduğumuz objeye sıkı sıkıya bağımlı olacaktık. yarın patron gelip biz oracle server geçiyoruz dediğinde tüm kodları baştan yazmamız gerekecekti.
bağımlığı aldığıma göre artık kendi dosyamda bunu istediğim gibi kullanabilirim. öteki dosyaları yazan arkadaşım istediği gibi değişiklik yapsın ben o objelerin referansını almam yeterli olacaktır.
https://media.normalsozluk.com/up/2021/05/24/tpriesxnatjgpyt5.jpg
yarın (link: https://kafasozluk.com/yazar/yoldas-benjamin-franklin--48::yoldaş benjamin) geldi dedi biz mssql geçiyoruz, tamam dedik. tek yapacağım değişiklik şu olacaktır.
ondan sonra yoldaş benjamin franklin dedi ki biz yeni özel veri tabanı yönetim sistemi yazdık artık kafasözlükservere göre ekleme yapılacak.
arkadaşım hemen şu kodu yazdı;
ben ise hiçbir koduma dokunmadan aynı şekilde burayı değiştirdim.
yani sadece gelecek referansı değiştirdim. ama ben bunu new() ile kodlasaydım kodlarımı tekrar tekrar düzenlemem gerekecekti. veya if else döngüsüne girecektim. ayrıca bana özel bir istek gelirse sql sorgularını yazan arkadaşımla hiç muhatap olmama gerek yok. o gelen referansı kendi dosyamdan istediğim gibi yönetebilirim.
artıları :
1.büyük projelerde kodları yönetmeyi kolaylaştırıyor.
2.çalışan kişiler birbirlerine bağımlı olmadan kodlarını kendilerine göre yönetebiliyor.
eksileri :
1.küçük çaplı projelerde gereksiz olabiliyor.
2.cpu ve ram kaynaklarının sınırlı olduğu durumlarda kullanmadan önce bir kere daha düşünülmelidir.
3.projeye bir katman daha eklenir, karmaşıklık artar. (küçük projeler için.)
dependency ınversion konusundan çok daha fazlasını anlattık aslında. kendinize iyi bakın. sözlüğü de düzeltin linkler ön izleme yaparken doğru görünmüyor. :'(
edit: resimleri düzenledim karışmış.
haydi şimdi bunu nasıl kullanırız onu görelim.
öncelikle bir tane interface oluşturalım.
daha sonra bu interface bildiğiniz gibi onu implement eden sınıfların referansını tutar. daha doğrusu bunun için kullanırız. işte bu yüzden iki tane veri tabanı işlemlerini yapan class oluşturalım ve bunları implement ettirelim.
daha sonra custumer manager oluşturalım. burada constructor içinde dependency injection yaptım. yani artık bağımlılığımız dışardan parametre olarak geliyor. ve bu bağımlılık ıkafasozluksql intefacesini implement eden class olmak zorunda. yani artık bu gelen bağımlılıkta gelen şeyi istediğiniz gibi kodlayabilirsiniz. ilerde kodlarınızda değişiklik yapmadan yeni bir bağımlılık gönderebilirsiniz.
ama eğer biz bunu gevşek bağımlılık değil de, sıkı bağımlılık yapsaydık örnek olarak => kafasozlukmicrosoftserver server = new kafasozlukmicrosoftserver(); diye olsaydı server. add(); dediğimiz yerde biz "new kafasozlukmicrosoftserver();" bu oluşturduğumuz objeye sıkı sıkıya bağımlı olacaktık. yarın patron gelip biz oracle server geçiyoruz dediğinde tüm kodları baştan yazmamız gerekecekti.
bağımlığı aldığıma göre artık kendi dosyamda bunu istediğim gibi kullanabilirim. öteki dosyaları yazan arkadaşım istediği gibi değişiklik yapsın ben o objelerin referansını almam yeterli olacaktır.
https://media.normalsozluk.com/up/2021/05/24/tpriesxnatjgpyt5.jpg
yarın (link: https://kafasozluk.com/yazar/yoldas-benjamin-franklin--48::yoldaş benjamin) geldi dedi biz mssql geçiyoruz, tamam dedik. tek yapacağım değişiklik şu olacaktır.
ondan sonra yoldaş benjamin franklin dedi ki biz yeni özel veri tabanı yönetim sistemi yazdık artık kafasözlükservere göre ekleme yapılacak.
arkadaşım hemen şu kodu yazdı;
ben ise hiçbir koduma dokunmadan aynı şekilde burayı değiştirdim.
yani sadece gelecek referansı değiştirdim. ama ben bunu new() ile kodlasaydım kodlarımı tekrar tekrar düzenlemem gerekecekti. veya if else döngüsüne girecektim. ayrıca bana özel bir istek gelirse sql sorgularını yazan arkadaşımla hiç muhatap olmama gerek yok. o gelen referansı kendi dosyamdan istediğim gibi yönetebilirim.
artıları :
1.büyük projelerde kodları yönetmeyi kolaylaştırıyor.
2.çalışan kişiler birbirlerine bağımlı olmadan kodlarını kendilerine göre yönetebiliyor.
eksileri :
1.küçük çaplı projelerde gereksiz olabiliyor.
2.cpu ve ram kaynaklarının sınırlı olduğu durumlarda kullanmadan önce bir kere daha düşünülmelidir.
3.projeye bir katman daha eklenir, karmaşıklık artar. (küçük projeler için.)
dependency ınversion konusundan çok daha fazlasını anlattık aslında. kendinize iyi bakın. sözlüğü de düzeltin linkler ön izleme yaparken doğru görünmüyor. :'(
edit: resimleri düzenledim karışmış.
devamını gör...
9.
access modifiers
c# içinde şu an itibari ile 6 tane erişim belirteci vardır.
neden bunlara ihtiyacımız var?
eğer projeniz küçükse veya sadece siz kodluyorsanız, her şeyi public yapabilirsiniz. ama ama ama eğer ki siz bir şirkette çalışıyorsanız ve bu şirkette ki 100 kişi ile proje geliştiriyorsanız ve bunların hepsi sadece public kullanıyorsa o zaman şuna sebep olacaktır.
1. (x random tuş), x tuşuna bastığınız anda içinden çıkılmaz bir öneri alacaksınız.
2. %100 eminim ki birisi yanlışlıkla değiştirilmemesi gereken değerleri değiştirecektir.
3. yarın bir değeri değiştirdiğinizde tek tek elle bütün isimleri değiştirmeniz gerekecek. (çözümü encapsulation ama access modifiers öğrenmeden bunu uygulamakta zorlanırsınız.) encapsulation konusunu başka bir zaman anlatacağım, çok önemli bir konudur.
4. şirket batacak ve aç kalacaksınız. :)
bunlar;
örneğin class içinde int kafasozluk = 100; diye bir şey tanımlı olsun.
not: aşağıda ki yazı classın içindeki değişken üzerinden anlatılmıştır. dilerseniz başka objelere uyarlayabilirsiniz.
public int kafasozluk: her yerden erişilebilir.
private int kafasozluk: sadece o class içerisinden erişebilir.
protected int kafasozluk: aynı class içerisinde veya bu classın türemesi sonucunda erişilebilir.
internal int kafasozluk: sadece şu an kullandığınız proje dosyalarından erişebilir.
protected internal int kafasozluk: şu an kullandığınız proje veya başka bir projede içinde bulunduğu classın türetilmesi sayesinde erişilebilir.
private protected int kafasozluk: tür veya üyeye yalnızca bildiren proje içinde, aynı class veya ondan türetilen bir nesne ile erişilebilir.
her yerde söylenmeyen ek notlar:
1. namespace içinde direkt olarak tanımlanan class, struct, interface internal veya public dışında erişim belirteci alamaz. ama nested class her türlü erişim belirteci alabilir.
2. class, struct, interface default erişim belirteci internaldir. class ve struct içinde ki şeyler default olarak privatedir. interface istisna olarak publictir.
3. class ve structun içinde tanımlanmış interfaceler default olarak private olur.
4. nested classlar privatedir. kanıtı resimde, tersine mühendislik ile derleyici kodu nasıl çeviriyor, görebiliyoruz.
aha kanıtlarıyla:
bu benim yazdığım saçma sapan kodlar. isimlendirmelere takılmayın. kendim özel olarak test ettiğim için dikkat etmedim. :)
bu derleyici kodu çevirdikten sonra tersine mühendislik ile okuduğumuz kodlar:
türkçe karşılığı olmayan şeyleri türkçe olarak anlatmak ne zor yahu.. tdk lütfen bize kullanabileceğimiz oturgaçlı götürgeç gibi isimlendirmeler verin. hoş gerçi türkçeyi ben de çok düzgün kullanmıyorum. düzgün bir türkçe karşılık bulabilirsem bu yazıyı editleyeceğim.
neden bunlara ihtiyacımız var?
eğer projeniz küçükse veya sadece siz kodluyorsanız, her şeyi public yapabilirsiniz. ama ama ama eğer ki siz bir şirkette çalışıyorsanız ve bu şirkette ki 100 kişi ile proje geliştiriyorsanız ve bunların hepsi sadece public kullanıyorsa o zaman şuna sebep olacaktır.
1. (x random tuş), x tuşuna bastığınız anda içinden çıkılmaz bir öneri alacaksınız.
2. %100 eminim ki birisi yanlışlıkla değiştirilmemesi gereken değerleri değiştirecektir.
3. yarın bir değeri değiştirdiğinizde tek tek elle bütün isimleri değiştirmeniz gerekecek. (çözümü encapsulation ama access modifiers öğrenmeden bunu uygulamakta zorlanırsınız.) encapsulation konusunu başka bir zaman anlatacağım, çok önemli bir konudur.
4. şirket batacak ve aç kalacaksınız. :)
bunlar;
örneğin class içinde int kafasozluk = 100; diye bir şey tanımlı olsun.
not: aşağıda ki yazı classın içindeki değişken üzerinden anlatılmıştır. dilerseniz başka objelere uyarlayabilirsiniz.
public int kafasozluk: her yerden erişilebilir.
private int kafasozluk: sadece o class içerisinden erişebilir.
protected int kafasozluk: aynı class içerisinde veya bu classın türemesi sonucunda erişilebilir.
internal int kafasozluk: sadece şu an kullandığınız proje dosyalarından erişebilir.
protected internal int kafasozluk: şu an kullandığınız proje veya başka bir projede içinde bulunduğu classın türetilmesi sayesinde erişilebilir.
private protected int kafasozluk: tür veya üyeye yalnızca bildiren proje içinde, aynı class veya ondan türetilen bir nesne ile erişilebilir.
her yerde söylenmeyen ek notlar:
1. namespace içinde direkt olarak tanımlanan class, struct, interface internal veya public dışında erişim belirteci alamaz. ama nested class her türlü erişim belirteci alabilir.
2. class, struct, interface default erişim belirteci internaldir. class ve struct içinde ki şeyler default olarak privatedir. interface istisna olarak publictir.
3. class ve structun içinde tanımlanmış interfaceler default olarak private olur.
4. nested classlar privatedir. kanıtı resimde, tersine mühendislik ile derleyici kodu nasıl çeviriyor, görebiliyoruz.
aha kanıtlarıyla:
bu benim yazdığım saçma sapan kodlar. isimlendirmelere takılmayın. kendim özel olarak test ettiğim için dikkat etmedim. :)
bu derleyici kodu çevirdikten sonra tersine mühendislik ile okuduğumuz kodlar:
türkçe karşılığı olmayan şeyleri türkçe olarak anlatmak ne zor yahu.. tdk lütfen bize kullanabileceğimiz oturgaçlı götürgeç gibi isimlendirmeler verin. hoş gerçi türkçeyi ben de çok düzgün kullanmıyorum. düzgün bir türkçe karşılık bulabilirsem bu yazıyı editleyeceğim.
devamını gör...
10.
constructor
düzenleme : kodlama hataları düzeltildi. ıde kullanmadan baya kötü ve hatalı kod yazmışım. :d ayrıca kodlar resim haline çevrildi, bunun daha kaliteli olduğunu ve okunabilir olduğunu düşünüyorum. video kısmı maalesef ekleyemedim. :( ama yakında ekleyeceğim.
(yazdığım kodlardan utandım, çaktırma ;d )
türkçe adı yapıcı fonksiyon olarak geçer. classın içinde class ile aynı isme sahip bir fonksiyondur. return (geri dönüş.) tipi yoktur.
derleyici constructor'ı çağırdığınız zaman bellekte oluşturulması ve set edilme işlemlerinin beraber yapıldığından emin olmak ister. bu yüzden nesnelerimiz yamuk yapma ihtimali yok olur. hehe. :)
bu bilgilerden sonra c# için yapıcı fonksiyonları anlatmaya başlayabilirim.
yapıcı fonksiyonların default erişim belirteci private. yani türkçe adı ile özeldir.
private constructors
siz bu yapıcı fonksiyonda bir nesne oluşturamayacaksınız.
kafasozluk kafasozluk = new kafasozluk(); // bu hata verir.
işte bu yüzden biz bunun içindekileri (genellikle) static olarak tanımlarız. çünkü bu classtan bir nesne oluşturamayacaksınız.
şimdi gelin daha detaylıca görelim.
gördüğünüz gibi biz bunları genellikle böyle kullanıyoruz.
static constructors
statik bir kurucu, herhangi bir statik veriyi başlatmak için kullanılır.
not: bunu böyle löps diye kullanmayın. çok fazla dikkat etmeniz gereken şey var. sizi buradan official document kısmına bırakayım.
public constructors
public olanı böyle kullanıyoruz.
constructors değer kopyalama olayı
değer kopyalama olayı bu kadar basit işte.
başlamadan önce "base" ne demek?
resimde her şey açık. :)
gerçek hayatta nasıl kullanıyoruz.
şimdi gelelim zurnanın zurt dediği yere. gerçek hayat kullanımları. buraya bir video çekeceğim. bu kısmı yazarak anlatmak çok zor.
not: video çok yakında sizlerle.
abstract;
concrete
//datalı olanlar.
not: kafanıza takılan bir yer varsa, sormaktan lütfen çekinmeyin.
(yazdığım kodlardan utandım, çaktırma ;d )
türkçe adı yapıcı fonksiyon olarak geçer. classın içinde class ile aynı isme sahip bir fonksiyondur. return (geri dönüş.) tipi yoktur.
derleyici constructor'ı çağırdığınız zaman bellekte oluşturulması ve set edilme işlemlerinin beraber yapıldığından emin olmak ister. bu yüzden nesnelerimiz yamuk yapma ihtimali yok olur. hehe. :)
bu bilgilerden sonra c# için yapıcı fonksiyonları anlatmaya başlayabilirim.
yapıcı fonksiyonların default erişim belirteci private. yani türkçe adı ile özeldir.
private constructors
siz bu yapıcı fonksiyonda bir nesne oluşturamayacaksınız.
kafasozluk kafasozluk = new kafasozluk(); // bu hata verir.
işte bu yüzden biz bunun içindekileri (genellikle) static olarak tanımlarız. çünkü bu classtan bir nesne oluşturamayacaksınız.
şimdi gelin daha detaylıca görelim.
gördüğünüz gibi biz bunları genellikle böyle kullanıyoruz.
static constructors
statik bir kurucu, herhangi bir statik veriyi başlatmak için kullanılır.
not: bunu böyle löps diye kullanmayın. çok fazla dikkat etmeniz gereken şey var. sizi buradan official document kısmına bırakayım.
public constructors
public olanı böyle kullanıyoruz.
constructors değer kopyalama olayı
değer kopyalama olayı bu kadar basit işte.
başlamadan önce "base" ne demek?
resimde her şey açık. :)
gerçek hayatta nasıl kullanıyoruz.
şimdi gelelim zurnanın zurt dediği yere. gerçek hayat kullanımları. buraya bir video çekeceğim. bu kısmı yazarak anlatmak çok zor.
not: video çok yakında sizlerle.
abstract;
concrete
//datalı olanlar.
not: kafanıza takılan bir yer varsa, sormaktan lütfen çekinmeyin.
devamını gör...
11.
bit
bilgisayarın temel yapı taşları. ram ve cpu belleği üzerinde gözle görülmeyen minnacık kutucuklar vardır. bu kutulara bitler nasıl yerleştirilir?
atıyorum 28 sayısı nasıl depolanır?
öncelikle 28 sayısı ikiye sürekli bölünür. ve aşağıda ki şekilde 1 ve sıfırlara dönüştürülür.
hemen ek olarak;
ikilik sayı sisteminden bizim günlük hayatta kullandığımız 10'luk sayma sistemine şu şekilde çeviriyoruz. her basamak 2’nin kuvveti ile çarpılır ve sonuçların toplamı onluk sayıyı verir. yani 28 sayısının 11100 ya bunu hemen burada çevireyim.
(11100)₂ = (1 × 2⁴) + (1 × 2³) + (1 × 2²) + (0 × 2¹) + (0 × 2⁰) = (28)₁₀
ve işte ekranda gördüğümüz 28 sayısı. tata :)
daha sonra bunu belleğe yerleştirmeye hazırız. belleğe iki farklı şekilde yerleştirilir. bu yerleştirilme sırası işlemcinizin durumuna göre değişir.
bir de sekizlik sayı sistemimiz var. octal olarak geçiyor.
octal kelimesi latince “octo” (sekiz) kelimesinden türetilmiştir. ikilik sayı
sistemindeki sayıların daha kolay gösterilmesini sağlayan sayı sistemlerinden biri
olarak kullanılır. 2 üzeri 3 = 8 olduğundan, iki tabanındaki üç bitlik bir sayı, bir dijit sekizlik
sayı ile temsil edilebilir. böylece veri girişi daha kolay olacak ve verilerin
saklanması daha az yer kaplayacaktır.
sekizlik sayı sistemine şöyle çeviriyoruz.
daha anlatmadığım birçok sayı çevirme işlemi var. özetle bilgisayarların sayı sistemi ile bizim günlük hayatta kullandığımız sayı sistemleri aynı değildir. yani bilgisayarların matematiği daha farklıdır. biz insanlar olarak 10'luk sayı sistemini rahat bulduğumuz için onu kullanıyoruz. yani aslında matematik dediğimiz şey tamamen insan yapımı. bizim hayatı anlamlandırmak için kullandığımız bir şey.
not: yazıları ascii tablosuna göre çeviriyoruz. bilgisayar bizim yazı veya sayı girdiğimizi bir şekilde anlıyor. onu da şöyle çeviriyoruz. bunu yapan amcalar böyle kabul etmiş. bizde bunu böyle devam ettiriyoruz. tabii bunu biraz geliştirdik ama temeli budur.
kafa sözlükte kendinize iyi bakın. bir sonra ki yazımda görüşmek üzere.
güncelleme: küçük imla hataları düzeltildi.
atıyorum 28 sayısı nasıl depolanır?
öncelikle 28 sayısı ikiye sürekli bölünür. ve aşağıda ki şekilde 1 ve sıfırlara dönüştürülür.
hemen ek olarak;
ikilik sayı sisteminden bizim günlük hayatta kullandığımız 10'luk sayma sistemine şu şekilde çeviriyoruz. her basamak 2’nin kuvveti ile çarpılır ve sonuçların toplamı onluk sayıyı verir. yani 28 sayısının 11100 ya bunu hemen burada çevireyim.
(11100)₂ = (1 × 2⁴) + (1 × 2³) + (1 × 2²) + (0 × 2¹) + (0 × 2⁰) = (28)₁₀
ve işte ekranda gördüğümüz 28 sayısı. tata :)
daha sonra bunu belleğe yerleştirmeye hazırız. belleğe iki farklı şekilde yerleştirilir. bu yerleştirilme sırası işlemcinizin durumuna göre değişir.
bir de sekizlik sayı sistemimiz var. octal olarak geçiyor.
octal kelimesi latince “octo” (sekiz) kelimesinden türetilmiştir. ikilik sayı
sistemindeki sayıların daha kolay gösterilmesini sağlayan sayı sistemlerinden biri
olarak kullanılır. 2 üzeri 3 = 8 olduğundan, iki tabanındaki üç bitlik bir sayı, bir dijit sekizlik
sayı ile temsil edilebilir. böylece veri girişi daha kolay olacak ve verilerin
saklanması daha az yer kaplayacaktır.
sekizlik sayı sistemine şöyle çeviriyoruz.
daha anlatmadığım birçok sayı çevirme işlemi var. özetle bilgisayarların sayı sistemi ile bizim günlük hayatta kullandığımız sayı sistemleri aynı değildir. yani bilgisayarların matematiği daha farklıdır. biz insanlar olarak 10'luk sayı sistemini rahat bulduğumuz için onu kullanıyoruz. yani aslında matematik dediğimiz şey tamamen insan yapımı. bizim hayatı anlamlandırmak için kullandığımız bir şey.
not: yazıları ascii tablosuna göre çeviriyoruz. bilgisayar bizim yazı veya sayı girdiğimizi bir şekilde anlıyor. onu da şöyle çeviriyoruz. bunu yapan amcalar böyle kabul etmiş. bizde bunu böyle devam ettiriyoruz. tabii bunu biraz geliştirdik ama temeli budur.
kafa sözlükte kendinize iyi bakın. bir sonra ki yazımda görüşmek üzere.
güncelleme: küçük imla hataları düzeltildi.
devamını gör...
12.
http
http (hyper-text transfer protocol)
kısaca bilgi vermek gerekirse 9 tane istek modeli vardır, bunlar;
not: türkiye'de ki yazılımcılar ve şirketler kodun okunması daha kolay olsun diye genelde post ve get komutunu kullanır.
get
get yöntemi, belirtilen kaynağın bir temsilini ister. özetle istek yaptığınızda verileri getirir. örnek olarak, kafa sözlük sitesin yenile tuşuna basmanız verilebilir. bunlar get komutu ile yapılır.
head
head yöntemi, get isteğiyle aynı olan ancak yanıt gövdesi olmayan bir yanıt ister. bu, tüm içeriği taşımak zorunda kalmadan yanıt başlıklarında yazılan meta bilgileri almak için kullanışlıdır.
not: benim tercihim çok ince optimizasyon yapmıyorsanız get kullanmanız olacaktır. kodların okunması sürdürebilir bir yazılım sağlar.
post
post yöntemi, sunucunun, talepte yer alan varlığı url tarafından tanımlanan web kaynağının yeni bir alt ögesi olarak kabul etmesini ister. örneğin ekşi sözlükte mesaj gönder tuşu bu komutu çalıştırır. aynı mesajı 3-5 defa yolladığı zamanlar oluyor değil mi? sebep olan şeyi birazdan açıklayacağım.
not: yukarıda ki aynı sebeple post kullanmanız olacaktır. kodların okunması sürdürebilir bir yazılım sağlar.
put
put yöntemi, kapalı varlığın sağlanan url altında depolanmasını ister. url zaten var olan bir kaynağa başvuruyorsa, değiştirilir; url mevcut bir kaynağa işaret etmiyorsa, sunucu bu url ile kaynağı oluşturabilir.
delete
delete adı üstünde kaynağı silmeye yarıyor.
trace
trace, alınan isteği yansıtır, böylece bir istemci (mesela bu web sitesi), ara sunucular tarafından (varsa) hangi değişikliklerin veya eklemelerin yapıldığını görebilir.
optıons
optıons yöntemi, sunucunun belirtilen url için desteklediği http yöntemlerini döndürür.
connect
connect yöntemi, istek bağlantısını şeffaf bir tcp/ıp'ye bağlantısına dönüştürür.
not: tcp = verilerin karşı tarafa aktarıldığından %100 emin olmak ister. yani karşı tarafa veriniz kayıpsız olarak ulaşır. bunun için tasarlanmıştır.
patch
patch yöntemi, bir kaynağa kısmi değişiklikler uygular.
tüm genel amaçlı http sunucularının en azından get ve head yöntemlerini uygulaması gerekir ve diğer tüm yöntemler şartnameye göre isteğe bağlı kabul edilir.
kodlar
hani tarayıcıda 500 error hatası falan alıyorsunuz hatırladınız mı? işte bu kodlar şu anlama geliyor.
bilgi 1xx
başarılı 2xx
yönlendirme 3xx
istemci hatası 4xx
sunucu hatası 5xx
put ve delete yöntemleri etkisiz olarak tanımlanır, yani birden çok özdeş isteğin tek bir istekle aynı etkiye sahip olması gerekir. get, head, optıons ve trace yöntemleri, güvenli olarak tanımlanır ve http durumsuz bir protokol olduğundan etkisiz olmalıdır. post cacheable (bellekte tutulabilir.). ama put ve delete cacheable olamaz.
işte bu yüzden mesajlarınız 3-5 defa gidiyordu.
http güvenli değildir eğer sizi dinlemek isteyen kişi işini iyi biliyorsa ruhunuz bile duymaz. güvenlik için lütfen https tercih edin. onu da başka bir zaman anlatırım.
kısaca bilgi vermek gerekirse 9 tane istek modeli vardır, bunlar;
not: türkiye'de ki yazılımcılar ve şirketler kodun okunması daha kolay olsun diye genelde post ve get komutunu kullanır.
get
get yöntemi, belirtilen kaynağın bir temsilini ister. özetle istek yaptığınızda verileri getirir. örnek olarak, kafa sözlük sitesin yenile tuşuna basmanız verilebilir. bunlar get komutu ile yapılır.
head
head yöntemi, get isteğiyle aynı olan ancak yanıt gövdesi olmayan bir yanıt ister. bu, tüm içeriği taşımak zorunda kalmadan yanıt başlıklarında yazılan meta bilgileri almak için kullanışlıdır.
not: benim tercihim çok ince optimizasyon yapmıyorsanız get kullanmanız olacaktır. kodların okunması sürdürebilir bir yazılım sağlar.
post
post yöntemi, sunucunun, talepte yer alan varlığı url tarafından tanımlanan web kaynağının yeni bir alt ögesi olarak kabul etmesini ister. örneğin ekşi sözlükte mesaj gönder tuşu bu komutu çalıştırır. aynı mesajı 3-5 defa yolladığı zamanlar oluyor değil mi? sebep olan şeyi birazdan açıklayacağım.
not: yukarıda ki aynı sebeple post kullanmanız olacaktır. kodların okunması sürdürebilir bir yazılım sağlar.
put
put yöntemi, kapalı varlığın sağlanan url altında depolanmasını ister. url zaten var olan bir kaynağa başvuruyorsa, değiştirilir; url mevcut bir kaynağa işaret etmiyorsa, sunucu bu url ile kaynağı oluşturabilir.
delete
delete adı üstünde kaynağı silmeye yarıyor.
trace
trace, alınan isteği yansıtır, böylece bir istemci (mesela bu web sitesi), ara sunucular tarafından (varsa) hangi değişikliklerin veya eklemelerin yapıldığını görebilir.
optıons
optıons yöntemi, sunucunun belirtilen url için desteklediği http yöntemlerini döndürür.
connect
connect yöntemi, istek bağlantısını şeffaf bir tcp/ıp'ye bağlantısına dönüştürür.
not: tcp = verilerin karşı tarafa aktarıldığından %100 emin olmak ister. yani karşı tarafa veriniz kayıpsız olarak ulaşır. bunun için tasarlanmıştır.
patch
patch yöntemi, bir kaynağa kısmi değişiklikler uygular.
tüm genel amaçlı http sunucularının en azından get ve head yöntemlerini uygulaması gerekir ve diğer tüm yöntemler şartnameye göre isteğe bağlı kabul edilir.
kodlar
hani tarayıcıda 500 error hatası falan alıyorsunuz hatırladınız mı? işte bu kodlar şu anlama geliyor.
bilgi 1xx
başarılı 2xx
yönlendirme 3xx
istemci hatası 4xx
sunucu hatası 5xx
put ve delete yöntemleri etkisiz olarak tanımlanır, yani birden çok özdeş isteğin tek bir istekle aynı etkiye sahip olması gerekir. get, head, optıons ve trace yöntemleri, güvenli olarak tanımlanır ve http durumsuz bir protokol olduğundan etkisiz olmalıdır. post cacheable (bellekte tutulabilir.). ama put ve delete cacheable olamaz.
işte bu yüzden mesajlarınız 3-5 defa gidiyordu.
http güvenli değildir eğer sizi dinlemek isteyen kişi işini iyi biliyorsa ruhunuz bile duymaz. güvenlik için lütfen https tercih edin. onu da başka bir zaman anlatırım.
devamını gör...
13.
ingilizce
amerika'da saatler 5.10 diyelim, siz "saat kaç?" diye soru sorarsanız alacağınız cevap "five-ten" olacaktır. yılı sorarsanız "twenty-twenty one" diye cevap almanız içten bile değil. artık "you was" diye bahsedilen şarkılar dahi var. bakınız burada , buradan ve buradada olduğu gibi.
too, so, must, may gibi kullanımlara hiç girmiyorum. o kadar çok yanlış kullanıyoruz ki insanlara derdimizi anlatamıyoruz. çünkü dil değişen bir şey ve sizin güncel kalmanız gerekiyor.
ek olarak: amerikan ingilizcesini sokakta konuşulan hali ile öğrenmek istiyorsanız. aha şu kanalı önerebilirim.
özetle türkiye'de öğretilen ingilizce dünya'da kullanılan ingilizce değil. evet biliyorum belki gramer olarak yanlış ancak sokakta kullanımlar böyle ister sev, ister sevme.
too, so, must, may gibi kullanımlara hiç girmiyorum. o kadar çok yanlış kullanıyoruz ki insanlara derdimizi anlatamıyoruz. çünkü dil değişen bir şey ve sizin güncel kalmanız gerekiyor.
ek olarak: amerikan ingilizcesini sokakta konuşulan hali ile öğrenmek istiyorsanız. aha şu kanalı önerebilirim.
özetle türkiye'de öğretilen ingilizce dünya'da kullanılan ingilizce değil. evet biliyorum belki gramer olarak yanlış ancak sokakta kullanımlar böyle ister sev, ister sevme.
devamını gör...
14.
windows xp
ilk olarak 2001 yılında, ağustos ayı içerisinde yayınlanmıştır. şirket için çalışanlarına kaynak kodları açıktır. ama daha sonra bazı torrent sızıntıları olmuş ancak daha sonra bu ortadan kalkmıştır.
ayrıca kendisinin kaynak kodunun bir kopyasına bende sahibim. (yaklaşık olarak 50gb, dosyalar service pack1)
üzücü olan kısım bu dosyaların maalesef bazıları şifreli, umarım bir gün şifreleri kırabilirim veya kıran birileri çıkar.
windows xp için fiziksel kısıtlamalar :
random access memory için (random erişimli bellek);
starter : 512 mb,
home, media center, tablet pc, proffessional: 4gb,
proffessional x64, 64 bit(ıtanium): 128 gb,
buradan ram ile ilgili kısıtlamaların olduğu kaynağa ulaşabilirsiniz.
central processing unit için (merkezi işlem birimi);
windows xp professional iki fiziksel çekirdeği destekler. windows xp home edition ise sadece tek bir fiziksel çekirdeği destekler. ek olarak 32 bit windows xp sürümleri 32 tane sanal çekirdeği desteklerken, bu oran 64 bit sistemlerde 64 tane sanal çekirdeğe çıkar.
buradan ve şuradan kaynaklara ulaşabilirsiniz.
sistem gereksinimleri;
kurulum için istenilen en düşük sistem gereksinimlerini resimdeki gibidir.
service pack sürümleri ve özellikleri:
service pack 1, service pack 2 ve service pack 3 adlı, 3 tane büyük güncellemesi vardır.
service pack 1;
300'den fazla bug düzeltmesi, 300'den fazla küçük, ve xp'nin orijinal sürümünden bu yana yayımlanan tüm güvenlik yamalarını içeriyordu. sp1 ayrıca, usb 2.0 desteği, microsoft java virtual machine , . net framework desteği ve o zamanlar piyasaya çıkacak olan media center ve xp tablet pc sürümleri tarafından kullanılan teknolojiler için destek ekledi .
service pack 2;
genel olarak güvenlik güncellemeleri devam etti. özellikle web ve e-posta güvenliği gibi konulara yoğunlaşıldı.
service pack 3;
daha önce yapılan güvenlik güncellemeleri güncellendi, artık daha güvenilir oldu. geliştiriciler için birçok güvenlik güncellemesi daha eklendi.
kaynaklar: buradan, buradan, ve buradan ayrıca ek olarak duyurular için şuradan ulaşabilirsiniz. linklerin bazıları çalışmıyor olabilir. sonuçta kaç yıllık kaynaklardan bahsediyoruz. kusurumu mahsur görünüz.
yayınlar:
windows xp'nin orijinal sürümü (hizmet paketi olmadan) desteği 30 eylül 2005'te sona erdi.
windows xp service pack 1, 10 ekim 2006'da, windows xp service pack 2 13 temmuz 2010'da ve windows xp service pack 3 ise 08.04.2014 tarihinde desteği son buldu. buradan windows xp işletim sisteminin tüm yaşam döngüsünü görebilirsiniz.
buradan ilk defa genel kullanım için yayınlandığı tarihi görebilirsiniz. (25 ekim 2001) ayrıca perakende satışlarda tam bu sırada başlamıştır.
kullanım alanlarının birkaçı :
mayıs 2021 tarihi itibaren windows bilgisayarların % 0,7'si windows xp [afrika'da %4] , ve tüm platformlardaki cihazların % 0,23'ü windows xp ile çalıştırılmaktadır.
mayıs 2017 itibarıyla hindistan'daki 220.000 atm'nin yaklaşık% 60'ı hâlâ windows xp çalıştırmaktadır. şu kaynaktan ulaşabilirsiniz.
ek olarak çin bilim akademisi windows 8'in kullanıcı verilerini güvenli olmayabileceğini konusunda uyardı. ayrıca çin hükümeti windows 8'in kullanımı yasaklasa bile korsanın önünü alamayacağını düşünüyordu. bunun sonucunda çin hükümeti resmi olarak ürünün desteğinin uzatılmasını talep etti. çünkü artık windows xp güvenlik güncellemeleri alamayacaktı. ama microsoft bunu ret etti.
ingiltere ve hollanda hükümeti windows xp'yi kendilerine özel destek için 5.5 milyon sterlin ödedi. buradan kaynağa ulaşabilirsiniz. microsoft bunu kabul etti ve bir yıl süre ile kendilerinin güvenliğini sağladılar.
çin'deki tüm bilgisayarların en az% 49'u 2014'ün başında hâlâ xp kullanıyordu.
bununla birlikte, atm'ler tipik olarak windows xp'nin ocak 2016'ya kadar desteklenen yerleşik sürümünü çalıştırmaktadır. kaynağa buradan ulaşabilirsiniz.
ayrıca windows xp yaşam döngüsü aşağıda ki resimdedir.
beni okuduğunuz için teşekkür ederim. burada windows xp'nin genel olarak bilgilerini verdim. umarım bilgilendirici olmuştur.
ayrıca kendisinin kaynak kodunun bir kopyasına bende sahibim. (yaklaşık olarak 50gb, dosyalar service pack1)
üzücü olan kısım bu dosyaların maalesef bazıları şifreli, umarım bir gün şifreleri kırabilirim veya kıran birileri çıkar.
windows xp için fiziksel kısıtlamalar :
random access memory için (random erişimli bellek);
starter : 512 mb,
home, media center, tablet pc, proffessional: 4gb,
proffessional x64, 64 bit(ıtanium): 128 gb,
buradan ram ile ilgili kısıtlamaların olduğu kaynağa ulaşabilirsiniz.
central processing unit için (merkezi işlem birimi);
windows xp professional iki fiziksel çekirdeği destekler. windows xp home edition ise sadece tek bir fiziksel çekirdeği destekler. ek olarak 32 bit windows xp sürümleri 32 tane sanal çekirdeği desteklerken, bu oran 64 bit sistemlerde 64 tane sanal çekirdeğe çıkar.
buradan ve şuradan kaynaklara ulaşabilirsiniz.
sistem gereksinimleri;
kurulum için istenilen en düşük sistem gereksinimlerini resimdeki gibidir.
service pack sürümleri ve özellikleri:
service pack 1, service pack 2 ve service pack 3 adlı, 3 tane büyük güncellemesi vardır.
service pack 1;
300'den fazla bug düzeltmesi, 300'den fazla küçük, ve xp'nin orijinal sürümünden bu yana yayımlanan tüm güvenlik yamalarını içeriyordu. sp1 ayrıca, usb 2.0 desteği, microsoft java virtual machine , . net framework desteği ve o zamanlar piyasaya çıkacak olan media center ve xp tablet pc sürümleri tarafından kullanılan teknolojiler için destek ekledi .
service pack 2;
genel olarak güvenlik güncellemeleri devam etti. özellikle web ve e-posta güvenliği gibi konulara yoğunlaşıldı.
service pack 3;
daha önce yapılan güvenlik güncellemeleri güncellendi, artık daha güvenilir oldu. geliştiriciler için birçok güvenlik güncellemesi daha eklendi.
kaynaklar: buradan, buradan, ve buradan ayrıca ek olarak duyurular için şuradan ulaşabilirsiniz. linklerin bazıları çalışmıyor olabilir. sonuçta kaç yıllık kaynaklardan bahsediyoruz. kusurumu mahsur görünüz.
yayınlar:
windows xp'nin orijinal sürümü (hizmet paketi olmadan) desteği 30 eylül 2005'te sona erdi.
windows xp service pack 1, 10 ekim 2006'da, windows xp service pack 2 13 temmuz 2010'da ve windows xp service pack 3 ise 08.04.2014 tarihinde desteği son buldu. buradan windows xp işletim sisteminin tüm yaşam döngüsünü görebilirsiniz.
buradan ilk defa genel kullanım için yayınlandığı tarihi görebilirsiniz. (25 ekim 2001) ayrıca perakende satışlarda tam bu sırada başlamıştır.
kullanım alanlarının birkaçı :
mayıs 2021 tarihi itibaren windows bilgisayarların % 0,7'si windows xp [afrika'da %4] , ve tüm platformlardaki cihazların % 0,23'ü windows xp ile çalıştırılmaktadır.
mayıs 2017 itibarıyla hindistan'daki 220.000 atm'nin yaklaşık% 60'ı hâlâ windows xp çalıştırmaktadır. şu kaynaktan ulaşabilirsiniz.
ek olarak çin bilim akademisi windows 8'in kullanıcı verilerini güvenli olmayabileceğini konusunda uyardı. ayrıca çin hükümeti windows 8'in kullanımı yasaklasa bile korsanın önünü alamayacağını düşünüyordu. bunun sonucunda çin hükümeti resmi olarak ürünün desteğinin uzatılmasını talep etti. çünkü artık windows xp güvenlik güncellemeleri alamayacaktı. ama microsoft bunu ret etti.
ingiltere ve hollanda hükümeti windows xp'yi kendilerine özel destek için 5.5 milyon sterlin ödedi. buradan kaynağa ulaşabilirsiniz. microsoft bunu kabul etti ve bir yıl süre ile kendilerinin güvenliğini sağladılar.
çin'deki tüm bilgisayarların en az% 49'u 2014'ün başında hâlâ xp kullanıyordu.
bununla birlikte, atm'ler tipik olarak windows xp'nin ocak 2016'ya kadar desteklenen yerleşik sürümünü çalıştırmaktadır. kaynağa buradan ulaşabilirsiniz.
ayrıca windows xp yaşam döngüsü aşağıda ki resimdedir.
beni okuduğunuz için teşekkür ederim. burada windows xp'nin genel olarak bilgilerini verdim. umarım bilgilendirici olmuştur.
devamını gör...
15.
c#
microsoft tarafından geliştirilen, java diline rakip olarak çıkartılan, çok ama çok güçlü bir dil.
dilin özellikleri:
1. oop programlama yapabiliyoruz.
2. yüksek seviyeli (insan diline yakın.).
3. c#, daha iyi bir java'ya rakip olmak için microsoft tarafından çıkarılmıştır. değer tipleri olsun, özellikler olsun, reified genericler olsun, gerçekten daha iyi bir java'dır. ancak en başta sadece windows üzerinde desteklenirken, son zamanlarda diğer platformlarda da desteklenmeye başlanmıştır.
4. türkiye'de aç bırakmaz. ;)
5. drl denilen bir sistem var. yazdığınız kodlar direkt olarak makine koduna çevrilmiyor. java gibi ara bir forma dönüştürülüp. clr tarafından algılanabilecek bir forma dönüştürülüyor.
drl özellikleri;
1.herhangi bir tip seçiminin yapılmaması,
2.derleme yapılmaması, yorumlama ile kodların çalıştırılması,
3.tüm işlemlerin (tip atamalarının, tip bağlamalarının) çalışma zamanında yapılması,
4.geliştiriminin kolay olması olarak söyleyebiliriz.
artıları:
1. hızlı geliştirme ortamı.
2. tip güvenli bir dil.
3. c ve c++ dillerin yazım tarzına benzediği için kolayca bu dile geçiş yapabiliyorsunuz.
4. arkasında microsoft gibi dev bir şirketin desteği var.
eksileri:
1. yüksek seviyeli bir dil olduğu için hız konusunda bir tık geri.
2. geliştirilen ıde genellikle visual studio olduğu için bazı buglar ile karşılaşma ihtimaliniz çok yüksek.
herkesin bilmediği küçük detaylar :
1. bounds check elimination;
for (var i = 0; i < arr.length ; i++)
{
arr[i] *=3; //diyelim ki her elemanı üçle çarpıyoruz.
}
burada ilk dikkati çeken şey arr. length in tekrar tekrar hesaplanması, bu her ne kadar gereksiz görünse de aslında döngünün daha hızlı çalışmasına neden oluyor. neden mi?
çünkü arr. length bir cpu belleğine depolanıyor sebebi arraylerin uzunlukları sabittir. ayrıca derleyici burada ne yapacağınızı çok iyi bildiği için bounds check elimination olayı oluyor. yani arr. length tekrar tekrar hesaplama olayını pas geçiyor, çünkü sonuçları belli.
2. çoğu kişinin yanlış bildiği şeyler;
1. ınterfacelerin kendisi default olarak internaldir. ama içinde olan her şey default olarak publictir.
2. classlar default olarak private değil internaldir. ama içinde olan her şey default olarak privatedir.
3. ınterfacelere özellikle çok büyük güncelleme geldi. artık içinde fonksiyonu tanımlayabiliyor ve değişkenlere değer verebiliyoruz. bunu yazma sebebim hâlâ internet ortamında ınterfacelerin sadece imza için kullanıldığı..., aslında ınterfaceleri classların referansını tutmak için kullanırız.
özetle;
genel iş uygulamaları, mobil yazılımlar, genel web siteleri yapacaksanız ve bir şeyleri uzun uzun okuyup öğrenecek kadar zamanınız varsa c# veya java öğrenmekten çekinmeyin.
not: ekleyeceğim aslında çok şey var ama şu an aklıma gelenler bunlar. özellikle "... kullanımında oluşabilecek allocationlar" bilmeniz size çok öne geçirir.
bilmediğim ve merak ettiğim şeyler; clr bizim kodlarımızı ara forma dönüştürdükten sonra işletim sisteminin fonksiyonlarını nasıl çağırıp ona derdini anlatıyor? çok büyük ihtimalle tahminim referans adresini vermesi, öbür türlü işlerin çok sakata girme şansı var.
çok istek gelmesi durumunda, bu yazıyı tematik yapıp tüm bildiklerimi aktarmaya çalışacağım. sizlere verebileceğim su üstü bilgilerden bu kadar. kendinize iyi bakın.
dilin özellikleri:
1. oop programlama yapabiliyoruz.
2. yüksek seviyeli (insan diline yakın.).
3. c#, daha iyi bir java'ya rakip olmak için microsoft tarafından çıkarılmıştır. değer tipleri olsun, özellikler olsun, reified genericler olsun, gerçekten daha iyi bir java'dır. ancak en başta sadece windows üzerinde desteklenirken, son zamanlarda diğer platformlarda da desteklenmeye başlanmıştır.
4. türkiye'de aç bırakmaz. ;)
5. drl denilen bir sistem var. yazdığınız kodlar direkt olarak makine koduna çevrilmiyor. java gibi ara bir forma dönüştürülüp. clr tarafından algılanabilecek bir forma dönüştürülüyor.
drl özellikleri;
1.herhangi bir tip seçiminin yapılmaması,
2.derleme yapılmaması, yorumlama ile kodların çalıştırılması,
3.tüm işlemlerin (tip atamalarının, tip bağlamalarının) çalışma zamanında yapılması,
4.geliştiriminin kolay olması olarak söyleyebiliriz.
artıları:
1. hızlı geliştirme ortamı.
2. tip güvenli bir dil.
3. c ve c++ dillerin yazım tarzına benzediği için kolayca bu dile geçiş yapabiliyorsunuz.
4. arkasında microsoft gibi dev bir şirketin desteği var.
eksileri:
1. yüksek seviyeli bir dil olduğu için hız konusunda bir tık geri.
2. geliştirilen ıde genellikle visual studio olduğu için bazı buglar ile karşılaşma ihtimaliniz çok yüksek.
herkesin bilmediği küçük detaylar :
1. bounds check elimination;
for (var i = 0; i < arr.length ; i++)
{
arr[i] *=3; //diyelim ki her elemanı üçle çarpıyoruz.
}
burada ilk dikkati çeken şey arr. length in tekrar tekrar hesaplanması, bu her ne kadar gereksiz görünse de aslında döngünün daha hızlı çalışmasına neden oluyor. neden mi?
çünkü arr. length bir cpu belleğine depolanıyor sebebi arraylerin uzunlukları sabittir. ayrıca derleyici burada ne yapacağınızı çok iyi bildiği için bounds check elimination olayı oluyor. yani arr. length tekrar tekrar hesaplama olayını pas geçiyor, çünkü sonuçları belli.
2. çoğu kişinin yanlış bildiği şeyler;
1. ınterfacelerin kendisi default olarak internaldir. ama içinde olan her şey default olarak publictir.
2. classlar default olarak private değil internaldir. ama içinde olan her şey default olarak privatedir.
3. ınterfacelere özellikle çok büyük güncelleme geldi. artık içinde fonksiyonu tanımlayabiliyor ve değişkenlere değer verebiliyoruz. bunu yazma sebebim hâlâ internet ortamında ınterfacelerin sadece imza için kullanıldığı..., aslında ınterfaceleri classların referansını tutmak için kullanırız.
özetle;
genel iş uygulamaları, mobil yazılımlar, genel web siteleri yapacaksanız ve bir şeyleri uzun uzun okuyup öğrenecek kadar zamanınız varsa c# veya java öğrenmekten çekinmeyin.
not: ekleyeceğim aslında çok şey var ama şu an aklıma gelenler bunlar. özellikle "... kullanımında oluşabilecek allocationlar" bilmeniz size çok öne geçirir.
bilmediğim ve merak ettiğim şeyler; clr bizim kodlarımızı ara forma dönüştürdükten sonra işletim sisteminin fonksiyonlarını nasıl çağırıp ona derdini anlatıyor? çok büyük ihtimalle tahminim referans adresini vermesi, öbür türlü işlerin çok sakata girme şansı var.
çok istek gelmesi durumunda, bu yazıyı tematik yapıp tüm bildiklerimi aktarmaya çalışacağım. sizlere verebileceğim su üstü bilgilerden bu kadar. kendinize iyi bakın.
devamını gör...