Blok tabanlı ve metin tabanlı diller

Blok tabanlı diller, öncelikle yeni başlayan kullanıcılar için tasarlandıkları için metin tabanlı dillerden çeşitli yönlerden farklıdır. Kendi blok tabanlı dilinizi tasarlarken dikkate almanız gereken noktaların listesi aşağıda verilmiştir.

Bire dayalı listeleri kullanma

Bir dizedeki belirli bir dizinde harfi seçen ve ilk harf için 1 kullanan blok.

Acemi programcılar, sıfır tabanlı listelerle ilk kez karşılaştıklarında olumsuz tepki verir. Sonuç olarak Blockly, liste ve dize dizine eklemeyi bir tabanlı hale getirerek Lua ve Lambda Moo'nun izinden gidiyor.

Blockly'nin daha gelişmiş kullanımları için metne geçişi kolaylaştırmak amacıyla sıfır tabanlı listeler desteklenir. Genç veya daha acemi kitleler için yine de 1 tabanlı dizine ekleme önerilir.

Öneri: Bir, ilk sayıdır.

Serbest adlandırma kurallarını destekler

Büyük/küçük harfe duyarlı olmayan location_x (küçük harf x) ve location_X (büyük harf X) değişken adlarına sahip bloklar.

Acemi programcılar, location_X ve location_x'un farklı değişkenler olduğunu düşünmez. Sonuç olarak Blockly, değişkenleri ve işlevleri büyük/küçük harf duyarlı hale getirerek BASIC ve HTML'yi takip eder. Scratch daha hassas bir yaklaşım kullanır (sağda görüldüğü gibi) ve değişken adları için büyük/küçük harf duyarlılığı gösterir ancak eşitlik kontrolleri için bunu yapmaz.

Ayrıca Blockly, değişkenlerin ve işlevlerin tipik [_A-Za-z][_A-Za-z0-9]* şemasına uygun olmasını gerektirmez. Bir değişkeni List of zip codes veya רשימת מיקודים olarak adlandırmak isterseniz bu tamamen normaldir.

Öneri: Büyük/küçük harfleri yoksayın, tüm adlara izin verin.

Tüm değişkenleri genel yapabilirsiniz.

Acemi programcılar da kapsamı anlamakta zorluk çeker. Sonuç olarak Blockly, tüm değişkenleri global hale getirerek Scratch'in izinden gider. Küresel değişkenlerin tek dezavantajı, yinelemenin daha karmaşık olmasıdır (değişkenleri bir listeye eklemek ve listeden çıkarmak gerekir). Ancak bu, Blockly'nin hedef kullanıcılarının kapsamı dışında kalan bir programlama tekniğidir.

Öneri: Kapsam dışında olduğundan daha sonra tekrar gözden geçirin.

İsteğe bağlı döndürülen değerleri nasıl işleyeceğinizi düşünün

Metne dayalı programlamada birçok işlev bir işlem gerçekleştirip ardından bir değer döndürür. Bu döndürülen değer kullanılabilir veya kullanılamayabilir. Örneğin, bir yığının pop() işlevi. Pop, son öğeyi almak ve kaldırmak için çağrılabilir veya yalnızca son öğeyi kaldırmak için çağrılabilir. Bu durumda, döndürülen değer yoksayılır.

var last = stack.pop();  // Get and remove last element.
stack.pop();  // Just remove last element.

Blok tabanlı diller genellikle döndürülen değeri yoksaymada iyi değildir. Değer bloklarının, değeri kabul eden bir yere bağlanması gerekir. Bu sorunu gidermek için çeşitli stratejiler vardır.

a) Sorunu atlayın. Blok tabanlı dillerin çoğu, bu tür durumları önlemek için dili tasarlar. Örneğin, Scratch'te hem yan etkisi hem de döndürülen değeri olan bloklar yoktur.

b) İki blok sağlayın. Araç kutusundaki alan sorun değilse bu türden her bir bloktan iki tane (biri döndürülen değere sahip, diğeri döndürülen değer içermeyen) sağlamak basit bir çözümdür. Bunun dezavantajı, neredeyse aynı blokların çok bulunduğu kafa karıştırıcı bir araç kutusuna yol açabilmesidir.

Bir listedeki son öğeyi kaldırıp döndüren bir değer bloğu ve yalnızca listedeki son öğeyi kaldıran bir ifade bloğu.

c) Bir bloğu mutasyona uğratın. Kullanıcının döndürülen değer olup olmayacağını seçmesine olanak tanıyan bir açılır menü, onay kutusu veya başka bir denetim kullanın. Ardından blok, seçeneklerine bağlı olarak şeklini değiştirir. Bunun bir örneğini Blockly'nin liste erişimi bloğunda görebilirsiniz.

Bir listedeki son öğeyi kaldırırken, bu öğeyi döndürüp döndürmediğine bağlı olarak şeklini değer bloğundan ifade bloğuna değiştiren blok.

d) Değeri tüketin. App Inventor'ın ilk sürümü, bağlı tüm değerleri tüketen özel bir boru bloğu oluşturuyordu. Kullanıcılar bu kavramı anlamadı ve App Inventor'ın ikinci sürümünde boru bloğu kaldırıldı ve bunun yerine kullanıcıların değeri tek kullanımlık bir değişkene atamaları önerildi.

Bir bloğun çıktısını yoksaymanın iki farklı yolunu gösteren bloklar. İlki, değeri "yemek" için bir boru bloğu kullanır ve ikincisi "junk" adlı bir değişkenin değerini ayarlar.

Öneri: Her stratejinin avantajları ve dezavantajları vardır. Kullanıcılarınız için doğru olanı seçin.

Okunabilir kod oluşturma

Gelişmiş Blockly kullanıcıları, oluşturulan koda (JavaScript, Python, PHP, Lua, Dart vb.) bakarak yazdıkları programı hemen tanıyabilir. Bu nedenle, makine tarafından oluşturulan bu kodun okunabilir kalması için ek çaba gösterilmesi gerekir. Gereksiz parantezler, sayısal değişkenler, sıkıştırılmış boşluklar ve ayrıntılı kod şablonlarının tümü, zarif kod oluşturmanın önünde engel teşkil eder. Oluşturulan kodda yorumlar bulunmalıdır ve kod Google'ın stil kılavuzlarına uygun olmalıdır.

Öneri: Oluşturduğunuz koddan gurur duyun. Kullanıcıya gösterin.

Diller arasındaki farklılıkları kabul edin

Net kod yazma arzusunun bir yan etkisi, Blockly'nin davranışının büyük ölçüde çapraz derlenmiş dilin davranışı açısından tanımlanmasıdır. En yaygın çıkış dili JavaScript'tir ancak Blockly farklı bir dile çapraz derlenecekse her iki dilde de tam davranışı korumak için mantıksız girişimlerde bulunulmamalıdır. Örneğin, JavaScript'te boş bir dize yanlış, Lua'da ise doğrudur. Blockly'nin kodunun hedef dilden bağımsız olarak yürütülmesi için tek bir davranış kalıbı tanımlamak, GWT derleyicisinden çıkmış gibi görünen, bakımı yapılamayan bir kodla sonuçlanacaktır.

Öneri: Blockly bir dil değildir. Mevcut dilin davranışı etkilemesine izin verin.