Yazılım derle

Çoğu zaman çeşitli algoritmalar veya gerçeklemeler aynı görevi doğru şekilde çözebilir. Seçtiğiniz kod bir tasarımı ifade eder. Kodunuzu okuyan geliştiriciler ve kodlama ajanları, amacınızı çıkarsamak için yapısını kullanır: her işlemin neye ihtiyacı olduğunu, nereye ait olduğunu ve ne zaman çalıştığını.

Tip

Bu makale, temel C# ifadelerini, deyimlerini ve yöntemlerini bilen geliştiricilere yönelik Temel Bilgiler bölümünün bir parçasıdır. Programlamaya yeni başladıysanız ilk olarak Başlangıç öğreticileri ile başlayın.

Bu bölüm algoritmalara yönelik geçerli yaklaşımları karşılaştırır ve davranışlarındaki küçük farkları ve okuyucuların bunları nasıl yorumladığını açıklar. Türler, ifadeler, komutlar ve yöntemler gibi tanıdık dil öğelerini birleştirecek ve amaçladığınız tasarımı iletecek biçimleri seçeceksiniz.

Davranışı ve tasarım amacını karşılaştırın

Bir gerçekleştirimi seçmeden önce, diğer kodun bunu nasıl kullanacağını göz önünde bulundurun. Bu kod çağıran koddur: girişleri sağlar, işleminizi çağırır ve sonuçları kullanır. Hemen tamamlanmış bir sonuç mu gerekiyor yoksa değerleri birer birer işleyebilir mi? Bu işlemin yardımcı bileşeni yalnızca bu işlemin bir parçası mı, yoksa diğer işlemler de bunu kullanacak mı? Bu sorular hem ihtiyacınız olan davranışı hem de kodunuzun yansıttığı tasarımı karşılaştırmanıza yardımcı olur.

Kısa bir satır içi işlem, okuyuculara kullanım noktasındaki adımları gösterir. Örneğin, Where(task => task.Priority > 3) filtreleme kuralını hemen görünür hale getirir. Where(IsUrgent) örneğinde olduğu gibi adlandırılmış bir yardımcı, kuralın amacını vurgular ve okuyucuların ayrıntılarını ayrı olarak incelemesine olanak tanır. Adımların veya amaçlarının çevresindeki kodu en iyi şekilde açıklayıp açıklamadığına göre seçin.

Bir yardımcıyı nerede tanımladığınız, amaçlanan kapsamını belirtir. ShowDashboard içindeki yerel işlev, yardımcının bu işleme ait olduğunu gösterir ve diğer üyelerin onu çağırmasını engeller. İçeren türdeki özel bir yöntem, yardımcının diğer üyelerin kullanımına sunulmasını sağlar ve bu yardımcıyı tür içinde başka yerlerde yeniden kullanmayı amaçladığınızı gösterir. Her ikisi de aynı hesaplamayı düzenleyebilir, ancak onun rolüne ilişkin okuyucularda farklı beklentiler yaratırlar.

Bir yardımcının girişlerini nasıl sağladığınız bağımlılıklarını iletir. IsUrgent(task, minimumPriority) gibi bir sınırı parametre olarak geçirmek, bu girdiyi her çağrıda görünür hale getirir. Bunun yerine yerel bir işlev veya lambda, değişkeni bağımsız değişken olarak almadan çevresindeki kapsamdan kullanarak yakalayabilirminimumPriority. Yakalama, yardımcıyı onu içeren işlemin bağlamına bağlar; açık parametreler, sağlanan verilerin tanımlanmasını kolaylaştırır. Çevre kapsamındaki durumu yakalamamasını zorunlu kılmak istediğinizde yerel bir static işlev veya lambda kullanın.

Sonuçları döndürme şekliniz, işin ne zaman gerçekleştiğini gösterir. Bir koleksiyon oluşturan ve döndüren yöntem, çağıran koleksiyonu almadan önce bu işi tamamlar. Yineleyici, çağıran talep ettikçe öğeler üretir, böylece çağıran tüm öğeler üretilmeden önce durabilir. Her ikisi de aynı değerleri üretebilir, ancak çağıranların tamamlanmış sonuçları mı yoksa hesaplaması henüz yapılmamış bir diziyi mi aldıklarını anlamaları gerekir.

Her seçim için, önce çağıran kodun ihtiyaç duyduğu davranışı belirleyin. Ardından başka bir geliştiricinin veya kodlama ajanının ad, kapsam, girişler ve sonuçtan ne çıkaracağını göz önünde bulundurun. Bu beklentileri tasarımınızla uyumlu kılan bir form seçin ve kodun şeklinin tek başına ortaya çıkarmadığı önemli davranışı açıklayın. Amaç, her yere bir form uygulamak yerine geçerli alternatifler arasında kasıtlı bir seçim yapmaktır.

Bir örnekte tasarım seçeneklerini okuyun

Aşağıdaki örnek, birkaç seçeneğin bir tasarımın farklı yönlerini nasıl ifade ettiğini göstermektedir. Acil ve başlamaya hazır görevleri görüntüler. bir ProjectTask görevin başlığını, önceliğini ve engellenen durumunu barındırıyor.

var tasks = new[]
{
    new ProjectTask("Confirm venue", Priority: 3, IsBlocked: false),
    new ProjectTask("Print badges", Priority: 2, IsBlocked: true),
    new ProjectTask("Test microphones", Priority: 2, IsBlocked: false),
};

ShowDashboard("Community meetup", tasks, minimumPriority: 2);

static void ShowDashboard(
    string projectName,
    IEnumerable<ProjectTask> tasks,
    int minimumPriority)
{
    var urgentTasks = tasks.Where(
        task => task.Priority >= minimumPriority);

    foreach (ProjectTask task in ReadyTasks(urgentTasks))
    {
        Console.WriteLine(FormatTask(task));
    }

    string FormatTask(ProjectTask task) =>
        $"{projectName}: {task.Title}";
}

static IEnumerable<ProjectTask> ReadyTasks(
    IEnumerable<ProjectTask> tasks)
{
    foreach (ProjectTask task in tasks)
    {
        if (!task.IsBlocked)
        {
            yield return task;
        }
    }
}

record ProjectTask(string Title, int Priority, bool IsBlocked);

Her seçim, işin farklı bir bölümünü net tutar:

  • geçirilen Where lambda, bunu kullanan işlemin yanına kısa bir öncelik kuralı koyar.
  • Yerel işlev FormatTask, yalnızca ShowDashboard öğesine ait olan bir biçimlendirme adımını adlandırıyor.
  • Yineleyici ReadyTasks, çağıranların ara koleksiyon oluşturmadan hazır görevleri işlemesine olanak tanır.
  • Döngü foreach , her sonucu yazarak son eylemi açık hale getirir.

Karşılaştırma için, Where(static task => !task.IsBlocked), bu hazırlık testi basit bir filtre olduğundan, ReadyTasks yerine kullanılabilir. Her iki form da filtreyi yinelemeye kadar erteler. Lambda, kuralı çağrı alanına koyar; ReadyTasks kurala bir ad verir. Okuyucuların arayanı anlamasına yardımcı olacak bilgilere göre aralarından seçim yapın.

Aşağıdaki makalelerde, her yaklaşımın ne zaman uygun olduğunu ve okuyucuların seçiminizden ne çıkarabileceğini açıklamak için aşağıdaki gibi karşılaştırmalar kullanılır.

Sonraki Adımlar