İşte düşüncelerinizi duymak istediğim bir programlama / dil problemi.
Çoğu programcının dil sözdiziminin bir parçası olmayan, ancak kodu daha okunabilir hale getirmeye hizmet ettiği kurallar geliştirdik. Bunlar elbette her zaman bir tartışma konusudur, ancak çoğu programcının uygun bulduğu en azından bazı temel kavramlar vardır. Değişkenlerinizi uygun şekilde adlandırmak, genel olarak adlandırmak, çizgilerinizi aşırı uzun sürmemek, uzun işlevlerden, kapsüllemelerden, bu şeylerden kaçınmak.
Bununla birlikte, henüz yorum yapan birini bulamadığım bir sorun var ve bu sadece en büyük grup olabilir. Bir işlevi çağırdığınızda argümanların anonim olması sorunu.
Fonksiyonlar, f (x) 'in açık bir anlama sahip olduğu matematikten kaynaklanır, çünkü bir fonksiyon genellikle programlamada yaptığı çok daha titiz bir tanıma sahiptir. Matematikteki saf işlevler programlamada olduğundan çok daha az şey yapabilir ve çok daha zarif bir araçtır, genellikle sadece bir argüman alırlar (genellikle bir sayıdır) ve her zaman bir değer (genellikle bir sayı) döndürürler. Bir işlev birden fazla bağımsız değişken alırsa, neredeyse her zaman işlevin etki alanının fazladan boyutlarıdır. Başka bir deyişle, bir argüman diğerlerinden daha önemli değildir. Açıkça sipariş edilirler, elbette, ancak bunun dışında anlamsal bir sıralamaları yoktur.
Bununla birlikte, programlamada daha fazla özgürlük tanımlayan fonksiyonumuz var ve bu durumda bunun iyi bir şey olmadığını iddia ediyorum. Yaygın bir durum, böyle bir işleve sahipsiniz
func DrawRectangleClipped (rectToDraw, fillColor, clippingRect) {}
Tanımlamaya bakıldığında, işlev doğru yazılırsa, ne olduğunu mükemmel bir şekilde açıklar. İşlevi çağırırken, IDE / editörünüzde bir sonraki argümanın ne olması gerektiğini söyleyecek bazı intellisense / kod tamamlama sihri bile olabilir. Fakat bekle. Aslında aramayı yazarken buna ihtiyacım olursa, burada eksik olduğumuz bir şey yok mu? Kodu okuyan kişi bir IDE avantajına sahip değildir ve tanıma geçmedikçe, argüman olarak geçen iki dikdörtgenin hangisinin ne için kullanıldığı hakkında hiçbir fikri yoktur.
Sorun bundan daha da ileri gidiyor. Argümanlarımız bazı yerel değişkenlerden geliyorsa, sadece değişken adını gördüğümüz için ikinci argümanın ne olduğunu bile bilmediğimiz durumlar olabilir. Örneğin bu kod satırını ele alalım
DrawRectangleClipped(deserializedArray[0], deserializedArray[1], deserializedArray[2])
Bu, farklı dillerdeki çeşitli uzantılara hafifletilir, ancak kesinlikle yazılan dillerde bile ve değişkenlerinizi mantıklı bir şekilde adlandırsanız bile, değişkenin işleve geçerken olduğu türden bile bahsetmezsiniz.
Genellikle programlamada olduğu gibi, bu soruna birçok potansiyel çözüm vardır. Birçoğu zaten popüler dillerde uygulanmaktadır. Örneğin C # 'daki adlandırılmış parametreler. Ancak, bildiğim her şeyin önemli dezavantajları var. Her işlev çağrısındaki her parametreyi adlandırmak okunabilir koda yol açamaz. Neredeyse düz metin programlamanın bize sunduğu olasılıkları fazlasıyla büyütüyormuşuz gibi geliyor. Hemen hemen her alanda SADECE metinden taşındık, ancak yine de aynı kodu yazıyoruz. Kodda görüntülenmesi için daha fazla bilgi gerekli mi? Daha fazla metin ekleyin. Her neyse, bu biraz teğetleşiyor, bu yüzden burada duracağım.
İkinci kod parçacığına aldığım bir cevap, muhtemelen ilk olarak bazı adlandırılmış değişkenlere diziyi açacağınız ve daha sonra bunları kullanacağınız, ancak değişkenin adı birçok şey anlamına gelebilir ve çağrıldığı yol size olması gerektiği şekilde söylemeyecektir. çağrılan fonksiyon bağlamında yorumlanabilir. Yerel kapsamda, semantik olarak temsil ettikleri şey olarak leftRectangle ve rightRectangle adlı iki dikdörtgeniniz olabilir, ancak bir işleve verildiğinde temsil ettiklerini genişletmesi gerekmez.
Aslında, değişkenleriniz çağrılan işlev bağlamında adlandırılırsa, bu işlev çağrısıyla potansiyel olarak yapabileceğinizden daha az bilgi girdiğinizden ve bir düzeyde kod daha kötü kodlara yol açıyorsa. RectForClipping içinde sakladığınız bir dikdörtgene neden olan bir yordam ve sonra rectForDrawing sağlayan başka bir yordam varsa, o zaman gerçek DrawRectangleClipped çağrısı sadece tören. Yeni bir şey anlamına gelmeyen bir çizgi var ve orada zaten adınızla açıklamış olsanız bile bilgisayar tam olarak ne istediğinizi biliyor. Bu iyi bir şey değil.
Bu konuda yeni perspektifler duymak isterim. Eminim bu sorunu ilk düşünen ben değilim, o zaman nasıl çözüldü?