C# 11’de File-Scoped Tipler

Selamlar bu makalede C#11 ile gelen birçok özellikten biri olan, file-scoped tipler hakkında konuşacağız.

C#11’de file-scoped tip, aslında başında file keywordü ile tanımlanmış sınıfın, enumun, interfacein.. yani kısaca başına konan objenin kapsamını ve görünürlüğünü içinde tanımlandığı dosya ile sınırlayan yeni bir erişim belirleyicisidir. Kısaca bir Access Modifers dır. Bu, sınıfın kapsamını sınırlandırarak kodun daha güvenli ve yönetilebilir olmasına yardımcı olur.

Kullanım Şekli:

Aşağıda ayrı bir dosyada(ScopedClass.cs) file scoped olarak işaretlenen ScopedClass sınıfını görüyoruz.

Sonuç:

Yukarıda ayrı bir dosyada tanımlı ScopedClass sınıfına “program.cs” altında erişilmeye çalışıldığında aşağıda görüldüğü gibi ”The type or namespace name ‘ScopedClass’ could not be found (are you missing a using directive or an assembly reference?)‘ şeklinde bir hat alınır.

Çözüm:

Eğer Scoped sınıfı, başka bir dosya altında değil de, program.cs altında yaratırsanız hata almadan result’ı console’da görebilirsiniz. Peki neden ? Çünkü artık file sınıf’a erişilebilmektedir. Çünkü aynı “program.cs” dosyası üstündedir. Peki ama bu ne işe yarar ? Dosyaya dışardan erişimini engelleyerek, aynı namespace altında diğer objeler ile isim çakışmasını engellemiş oluruz.

Bu kod üreteçlerini kullanarak zaman kazanmak ve hazır kod elde etmek isteyen developerların çok ça karşılaştığı bir durum vardır. O da projede kullanılan tür(Class, Interface, Struct, Enum, Delegate) adlarından herhangi birinin kod üreteçlerinin ürettiği adlarla ile çakışması durumunda, çakışan tür adlarının tek tek belirlenmesi ve buna göre adlarının değiştirilmesi gerekmesidir. Bunun yerine “file-scoped tipini” kullanarak, bu tür zorlukların üstesinden gelebiliriz. Bu dosya tipi kullanıldığında, tipin kapsamı dosya düzeyinde olacaktır. Bu, yalnızca o dosya içindeki uygulama tarafından erişilebileceği ve görülebileceği anlamına gelir. Böylece aynı tür adlarını, dosyanın dışında veya aynı ad alanı ve derleme içindeki diğer dosyaları kullanabiliriz ve yinelenen tür adı derleme hatalarını asla görmeyiz. Bu şekilde, kod oluşturucu tarafından oluşturulan kod ne olursa olsun, mevcut tür adlarında herhangi bir değişiklik yapılmadan doğrudan kullanabiliriz.

Şimdi gelin güzel bir örnek ile bu açıklamayı daha detaylıca inceleyelim.

Örnek:

Aşağıda görüldüğü gibi aynı Games sınıfı, hem Games.cs hem de Games2.cs dosyaları içinde aynı isimle tanımlanmıştır. Normal şartlar altında partial olmadığı sürece aynı sınıf birden fazla kere aynı isimle C#’da tanımlanamaz.

Games.cs:

Aşağıdaki örnekte Games sınıfı, bir karakterin hareketi sonucu koordinatlarında oluşacak değişimi hareket yönüne göre belirlemektedir.
Command sınıfında, “MoveCommand()” methodu ile karakterin başlangıç koordinatları ve hareket işleminden sonraki geldiği son koordinatlar, aynı dosya üstündeki Games sınıfı kullanılarak hesaplanmaktadır.

Games2.cs:

Aşağıdaki kodda Games.cs sınıfında ne yapılıyor ise hemen hemen aynı işlem sadece daha büyük hareket aralıkları ile gene aynı isimle Games2.cs dosyası üstündeki Games sınıfında yapılmaktadır. Bunu başarabilmemizin yolu, sınıfın başına tanımlanan “file” access modifiers keywordüdür.
Command2 sınıfı, internal olarak aynı dosya içinde olan Games2.cs altında olan Games sınıfını kullanarak, gene karakterin hareketinden sonra son koordinatını “MoveCommand()” methodu ile hesaplamaktadır.

program.cs: Aşağıda görüldüğü gibi yapılan hareketin tipine göre bir Enum “CommandType” tanımlanmıştır. Ayrıca aynı isime sahip iki Games sınıfı, farklı Command ve Command2 sınıflarında, kendi içlerinde Games sınıflarını kullanarak ayrı ayrı karakterin son koordinatlarını hesaplamışlardır.

Karakterin ilk değeri (1,1) olarak tanımlanmıştır. İlk Command sınıfında kullanılan Games sınıfında “MoveRight()” yani sağ hareket ile karakterin X koordinatı 1 arttırılıp, y koordinatı sabit kalmış ve => karakter (2,1) şeklinde bir koordinata gelmiştir. Daha sonra Command2 sınıfındaki Games sınıf kullanılarak yapılan “MoveDown()” hareketiyle karakterin X koordinatı sabit kalıp, y koordinatı 2 artmıştır. Karakterin son koordinatı (2,3) dür. Böylece “file” keyword’ü ile aynı isme ama farklı çalışma kurallarına sahip Games sınıfları, internal olarak kendi fiziksel dosyaları içinde hata vermeden kullanılmıştır.

Sonuç: Aynı projedeki iki farklı Games sınıfı, farklı hareket kurallarını kullanarak karakterin son koordinatını aşağıdaki gibi hesaplamışlardır.

Peki bu file keyword tanımlaması ile Scoped Tipler hangi nesneler için kullanılabilir ?

  • Class
  • Interface
  • Struct
  • Enum
  • Delegate

Rule.cs: Aşağıda görüldüğü gibi bir Interface, sadece local file içinde kullanımı “file” keywordü ile kısıtlanmıştır.

File Scoped Kullanımının Amacı Büyük Resim:

  1. Kapsa Sınırlar ve Anlamı Artırır: Kodun anlaşılmasını ve gereksiz yere diğer dosyalara veya projelere sızması önlenir. Bu da, kodun daha modüler ve yönetilebilir olmasını sağlar.
  2. *Çakışmaları Önler: Büyük projelerde aynı adlara sahip türler olabilir. File-scoped türler, tür adları çakışmalarını önlemeye yardımcı olur, çünkü bu türler yalnızca tanımlandığı dosyada geçerlidir.
  3. İçeriksel Birliktelik Sağlar: Bazı sınıflar veya yapılar, yalnızca belirli bir dosya içindeki ana sınıf veya yapı ile anlamlıdır. File-scoped types, bu tür sınıfları aynı dosyada tanımlayarak içeriksel birliktelik sağlar. Böylece ilgili kodlar tek bir dosyada bir arada tutulur ve bu da kodun bakımını kolaylaştırır.
  4. Daha Sıkı Erişim Denetimi Sağlar: İzole edilen sistemler daha güvenli ve hataya açık olmayan bir yapı sağlar. Bu sayede yalnızca gerekli olan minimum erişim düzeyi sağlanır.

Kısacası, C# 11’deki File-Scoped tipleri, kod organizasyonu ve güvenliği artırırken, projeleri daha modüler hale getirir ve büyük projelerde karmaşıklığın yönetilmesine ve en önemlisi çakışmaların minimuma indirilmesine yardımcı olur.

Geldik bir makalenin daha sonuna. Yeni bir makale görüşmek üzere hepinize hoşçakalın.

Github:

https://github.com/borakasmer/File_Scoped_Types

Kaynaklar:

 

 

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.