Sayfalar

13 Şubat 2025 Perşembe

SIKÇA SORULAN SORULAR

 1) JIT nedir? JIT ne işe yarar?

JIT, farklı dillerdeki .NET programlarının makine koduna dönüştürülerek yürütülmesinden sorumlu  bir derleyicidir. Kod yürütmeyi hızlandırır ve birden çok platformu destekler.

2) Response.Redirect ve Server.Transfer arasındaki fark nedir?

1️⃣ Response.Redirect, kullanıcının tarayıcısını başka bir sayfaya veya siteye yönlendirmeyi sağlar. Kullanıcının tarayıcı geçmişi de yeni sayfayı yansıtacak şekilde güncellenir. 

2️⃣ Server.Transfer, müşterinin tarayıcısına herhangi bir güncelleme yapmadan bir sayfadan diğerine aktarır. Server.Transfer durumunda tarayıcı geçmişi güncellenmez.

3) Left Right Inner ve Outer join arasındaki farklar nedir?

Sql Joins

4) SQL’de deadlock nedir? Nasıl Çözülebilir?

Veritabanına gönderilen iki ayrı işlemin birbiri ile bağlantılı olup ikisininde görevinin yapma koşulunun diğer işlemin sonucuna bağlı olması, diğer işlemin bitmesini beklemesi gerektiği yani sonsuz bekleyişe girilen ölümcül kilitlenme durumudur. Bu işlemler önceden tespit edilip deadlock durumunda daha önemli görülen işleme öncelik atanarak çözümlenebilir.
5) Microservice ve monolitik sistemler arasındaki farklılıklar nelerdir?
Microservice mimarisi, bir uygulamanın farklı işlevlerinin farklı servisler halinde ayrılmasıdır. Bu yaklaşım, uygulamayı daha esnek hale getirir, ölçeklenebilirliği artırır ve hata ayıklama ve bakımı kolaylaştırır. Monolitik mimari ise, tüm uygulamanın tek bir yapıda oluşturulmasıdır. Bu yaklaşım, uygulama geliştirmeyi daha kolay hale getirir, ancak büyük uygulamalarda ölçeklenebilirlik sorunlarına neden olabilir. Microservice yaklaşımı, uygulamanın her bir işlevini ayrı ayrı yönetme ve ölçekleme imkanı sağlar.

6) Referance ve Value Type nedir?

Value Type, Bilgileri hafızanın stack bölgesinde direk olarak saklayan nesnelerdir. Null değer alamazlar. Char, Bool örnek verilebilir. Çoğu yerde Value Type için eş anlamlı olduğundan Primitive Type’da denmektedir.

Referance Type, Bilgileri hafızanın stack bölgesinde tutar yalnız heap bölgesinde bir referans değeri tutar. Null değer alabilir. String, Class örnek verilebilir.

7) Http metodları nelerdir?

Http metodu bir REST API için yapılan isteğin türünü tanımlar. GET, POST, PUT, PATCH ve DELETE gibi HTTP yöntemleri temel CRUD işlemlerini oluştur. Oluştur, Oku, Güncelle, Sil gibi temel işlemleri gerçekleştirmek için oldukça sık kullanılmaktadır. Bunlara ek olarak pek sık kullanılmayan COPY, PURGE, LINK, UNLINK vb. gibi metotlar da vardır. En sık başvurulan HTTP metotları ve neden kullanıldıklarını sıralarsak:

  • GET: Veriyi almak
  • POST: Yeni veri eklemek
  • PUT: Varolan veriyi güncellemek
  • PATCH: Verinin sadece istenilen kısmında güncelleme yapmak
  • DELETE: Veriyi silmek

8) HTTP Response Kodları (HTTP Status) nelerdir?

Her istek başarılı veya başarısız bir response’la sonuçlanır. Http response kodları ise bu isteğin sonucunun ne olduğunu bildirmekle yükümlüdür. Bir web geliştirici iseniz halihazırda bunlara aşinasınızdır.

En çok kullanılanlara göz atıp farklı yaklaşımları ele alalım.

  • 200: OK, İşlem sorunsuz ve başarılı.GET /users/{id}
  • 201: Created, Yeni resource başarıyla oluşturuldu. |POST /users
  • 204: No Content, Resource boş/Resource silindi |DELETE /users/{id}
  • 400: Bad Request, Geçersiz request/Eksik ya da geçersiz query/parametre
  • 401: Unauthorized, Yetki/Authentication gerekiyor.
  • 403: Forbidden, Sunucuisteği reddetti ve isteğe yetkiniz yok
  • 404: Not found, İstekte bulunulan tekil resource mevcut değil
  • 405: Method Not Allowed: HTTP metodu yanlış
  • 409: Conflict: Uyumsuz istek, eski versiyondaki istek ya da Zaten varolan resource’u yeniden oluşturmaya çalışırken verilebilir.(Already exist)
  • 429: Too many requests, Çok fazla istekte bulunuldu.
  • 415: Unsupported Media Type: Desteklenmeyen ya da yanlış Content-Type
  • 5xx ise sunucu hatalarından oluşan HTTP response kodlarını içerir.

Rest API tasarımında her istek için doğru cevaplar almak çok önemlidir. API’yi kullanan geliştirici ve kullanıcılara doğru cevaplar vermek onları atacakları/yapacakları istek konusunda doğru bir şekilde yönlendirmeyi sağlar.


8) C# Struct ile Class Arasındaki Farklar Nelerdir?

Temelde classlar structların yapabildiği herşeyi yapabilmekte. Peki aradaki temel fark nedir? Bu sorunun cevabı OOP mimarisinde yatmaktadır. struct ile classların arasındaki en büyük fark (OOP’un en güçlü özelliği) kalıtımdır. structlar kalıtımı desteklememektedir. Bu sorunun kısaca cevabı budur. Bu cevaptan sonra diyebilirsiniz ki classlar structların bütün özelliklerini yerine getirebiliyorlarsa o zaman C#’ta structlar neden var derseniz, structlar daha performanslıdır. Yüksek performas gerektiren bazı özel durumlarda class yerine struct tercih edilebilir. Böylece classların referans özelliğinden kaynaklı ek işlemlerin olmamasıyla performans artacaktır.

9) Abstract class ile Interface Arasındaki Farklar Nelerdir?

  • Interface ve abstract class’lar new anahtar sözcüğü ile oluşturulamazlar.
  • Bir sınıf birden fazla interface’i kalıtım olarak alınabilir ama bir sınıfa bir tane abstract class kalıtım alınabilir.
  • Interface içerisinde boş metodlar tanımlanabilir ama abstract class’larda hem boş metodlar tanımlanabilir hemde içi dolu metodlar tanımlabilir.
  • Abstract sınıflar içerisinde metod gövdeleri tanımlanıp özellik değerleri ayarlandığı için genellikle sonradan geliştirilmek için kullanılıır ama interface ise body ve değer set edilemediği için tamamen interface üzerinden tüm üyeleri implemente edilerek geliştirmelere yapılması gereken durumlarda kullanılır.
  • Abstract class’lar içerisinde sadece abstract olarak işaretlenmiş metod ve özellikler implement edilmek zorundadır fakat interface içerisindeki tüm özellik ve metodlar implement edilmek zorundadır.
  • Bir class bir tane abstract class’ı kalıtım olarak alabilir ama bir class istenilen sayıda interface’i kalıtım olarak alabilir.
  • Interface içerisinde özellik ve metodlarda erişim belirleyiciler kullanılmaz herşey public olarak kabul edilir fakat abstract sınıflarda kullanılabilir.
  • Abstract sınıflara diğer sınıf ve interface’ler kalıtım olarak geçilebilir fakat interface’e herhangi bir yapı kalıtım olarak geçilemez.

10) Middleware yapısı nedir?

Middleware yapısı, ASP.NET’teki HttpModule nesnelerine benzetilebilir. Uygulama başlangıcında runtime’a eklenen middleware bileşenleri, eklendiği sıraya göre pipeline’ı oluşturmakta ve bir request geldiğinde bu sıraya göre tüm bileşenler çalışmaktadır. Eğer middleware bileşeni yaptığı kontrollerde bir sorunla karşılaşırsa request’i kesip sonlandırır ve ya her şey yolunda gidiyorsa sırasını salıp kendisinden sonraki middleware bileşenine yol verir.

11) .Net Core DI Yapısına Enjekte Edilen Tipler için Nesne Yaşam Süreleri nelerdir?

– Transient: Nesneye yapılan her çağrıda yeni bir nesne oluşturulur. Stateless nesneye ihtiyaç duyulan durumlarda kullanılır. AddTransient() metodu aracılığıyla Transient tipinde bağımlılıklar oluşturabiliriz.

– Scoped: Yapılan her request’te nesne tekrar oluşur ve bir request içerisinde sadece bir tane nesne kullanılır. Bu yöntem için de AddScoped() metodu kullanılıyor. Transient ve Scoped kullanım şekilleri nesne oluşturma zamanları açısından biraz karıştırılabilir. Transient’da her nesne çağrımında yeni bir instance oluşturulurken, Scoped’da ise request esnasında yeni bir instance oluşur ve o request sonlanana kadar aynı nesne kullanılır. Request bazında stateless nesne kullanılması istenen durumlarda Scoped bağımlılıkları oluşturabiliriz.

– Singleton: ASP.NET Core uygulaması başlatıldığında register edilen nesneye ait sadece bir tane instance oluşur ve uygulamadaki her yerden bu referans çağrılır. Uygulama yeniden başlatılana kadar bu nesne referansı kullanılır, farklı bir nesne referansı ikinci kez oluşturulmaz. Bu yöntem için de AddSingleton()metodunu kullanıyoruz.

12) SOLID nedir? SOLID başlıklarını kısaca açıklayınız.

Robert Cecil Martin aracılığıyla 2000’li yıllarda hayatımıza girdi. OOP geliştirme yapmak için uyulması gereken bazı kurallardan oluşmaktadır.

  1. (S)ingle Responsibility Principle(Tek Sorumluluk Prensibi): Her method ve class’ın tek bir sorumluluğu olur örnek olarak database işlemleri yapan bir class içerisinde log’lama işlemlerini yürüten işlemler konulmamalı yada loglama class’ımız var ise bu class içerisinde loglama haricinde başka bir şeylerin dahil edilmemesi gerekiyor ve metod’lardada aynı şekilde switch/case ile yönlendirmemek gerekiyor her metodun tek bir sorumluluğu olmalıdır.
  2. (O)pen/Closed Principle(Açık/Kapalı Prensibi): Değişime kapalı ama geliştirmeye açık şekilde kodlamanın kurgulanması gerekiyor mesela bugün log’lamaları xml’de yapıyorsunuz ama bir karar ile loglamanın artık xml’de değilde database’de yapılması istendi varolan kodlarınızda değişiklik değil güncelleme yapılması gerekiyor misal olarak xml log’laması yapan Single Reponsibility kuralına uymuş olan bir class’ınız var ve bu class ILogger arayüzünden türetilmiş Database loglaması yapacak class’ımızda bu arayüzden türetilip metod içerikleri ona göre yazılır böylelik bu değişiklik değil geliştirme olmuş olur. Kısacası Uygulama gelişime açık, değişime kapalı olmalıdır. Yani yeni eklenen bir modül için kodda gereksiz if blokları gibi değişiklikler olmamalıdır. Bunun yerine kalıtım yoluyla sorun çözülmelidir.
  3. (L)iskov ‘s Substitution Principle(Liskov’un yerine geçme prensibi): Liskov’un yerine geçme prensibi alt sınıflardan oluşturulan nesnelerin üst sınıfların nesneleriyle yer değiştirdiklerinde aynı davranışı göstermek zorunda olduklarını söyler. Yani;türetilen sınıflar, türeyen sınıfların tüm özelliklerini kullanmak zorundadır. Eğer kullanmaz ise ortaya işlevsiz, dummy kodlar çıkacaktır. Bu durumda üst sınıfta if else blokları kullanarak tip kontrolü yapmamız gerekebilir ve böylelikle Açık Kapalı prensibine de ters düşmüş oluruz. Interface Segregation Prinsiple kısmında interface’le üzerinden bu konu anlatılırken burada abstract class’lar üzerindeki kullanımdan bahsediliyor.
  4. (I)nterface Segregation Principle(Arayüz ayrımı prensibi): Bir arayüze gereğinden fazla kullanılmayacak özellik eklenmemelidir. Kullanılabilecek özellikler, metodlar eklenerek kullanılmalıdır.
  5. (D)ependency Inversion Principle(Bağımlılığın ters çevrilmesi prensibi): Bu prensibe göre de bir sınıf diğer bir sınıfa doğrudan bağımlı olmamalıdır. Aralarındaki bağ soyut bir kavram üzerinden sağlanmalıdır. Bu soyut kavram interface de olabilir abstract class da olabilir.

Solid’e ek olarak Kiss, Yangi, Dry, Reuse Release Equivalence, Common Closure prensipleri de bulunmaktadır.

Kiss(Keep it Simple Stupid – Basit Aptal Tutmak): Bir problemin birçok durumda birden fazla çözümü vardır ve biz yazılımcılar kendi bilgi/birikimlerimizi en iyi yansıtan, en karmaşık kod yapısını kullanmaya eğilimli olabiliyoruz. Kiss prensibine göre çözümlerimiz mümkün olduğunca sade/anlaşılır olmalı. En basit ve en optimum çözüm yöntemini seçerek uygulama geliştirmeliyiz.

Yangi(You Aren’t Gonna Need It! – Buna ihtiyacım yok!): Yangi prensibine göre, “o an” ihtiyacımız olmayan kodları sisteme dahil etmemeliyiz, ileride eklenebilecek özellikler hakkında öngürüde bulunup ek geliştirmeler yapmamalıyız.

Dry(Don’t Repeat Yourself – Kendinizi Tekrar Etmeyin): Proje içerisinde aynı kodu tekrar tekrar yazıyorsanız dry prensibine uymuyorsunuz demektir. Tekrarlı kod yapısında değişiklik olması, kullandığınız her yerde tek tek değiştirmenizi gerektirebilir ve ayrıca sistemi gereksiz yere karmaşık hale getirecektir. Böyle bir durumda, tekrarlı kodları merkezileştirecek bir çözüm üretmemiz gerekmektedir.

Reuse(Release Equivalence Principle): Sistemde kullanılan paketler/namespace’ler arasındaki bağımlılıkları yönetmek “tekrar kullanılabilir” yapılar kurmakla mümkün olur.

Common Closure(Ortak Kapama Prensibi): Single Responsibility’nin namespace’ler için uyarlanmış halidir. Aynı sebepten değişebilecek sınıflar aynı namespace altında bulunmalıdır. Böylelikle sistemde oluşabilecek değişikliklerin tüm sistemi etkilemesinin önüne geçilmesi amaçlanır.

13.   Şelale (Waterfall) ve Çevik (Agile) modellerini karşılaştırın. 

Şelale modeli, görevlerin doğrusal bir şekilde ele alındığı sıralı bir süreçtir. Genel olarak, gereksinimler net, iyi bilinen ve tamamen sabit olduğunda en iyi şekilde kullanılır. Çevik modeli, yüksek derecede işbirliği ile döngüsel modellere dayanan yinelemeli bir süreç kullanır. Geri bildirim ve gelecekteki ayarlamalar için geniş bir alan sağlar. Bu da onu, hedeflerin ve gereksinimlerin değişebileceği durumlarda daha uygun hale getirir.

14 . CORS nedir?

CORS, bir sunucunun tarayıcının kaynakların yüklenmesine izin vermesi gereken kendi dışındaki kökenleri tanımlamasına olanak tanıyan bir mekanizmadır.

15) OOP prensipleri nelerdir?

Encapsulation (Kapsülleme):Bu prensip sayesinde, sınıfın iç detayları dış dünyadan gizlenir ve sadece gerekli bilgilerin erişime açılmasını sağlar. Bu, yazılımın güvenliğini ve kolaylıkla yönetilmesini sağlar.

Inheritance (Kalıtım):Kod tekrarını önlemek ve mevcut kod üzerine yeni özellikler eklemeyi sağlar. Böylece, yazılımın genişletilebilirliği artar.

Polymorphism (Çok biçimlilik):Nesnelerin, aynı arayüzü farklı şekillerde implemente edebilmesini sağlar. Bu, kodun esnekliğini ve yeniden kullanılabilirliğini artırır.

Abstraction (Soyutlama):Kompleks yapıları, basit ve anlaşılır hale getirir. Bu, sistemin daha rahat anlaşılmasını ve yönetilmesini sağlar.


Hiç yorum yok:

Yorum Gönder