İşaretler kaynak kodunun okunmasını kolaylaştırır mı?


13

Çoğu programlama dilinde, değişkenlerin PHP'deki gibi tanımlayıcı karakterleri yoktur. PHP'de bir değişkenin $karakterin önüne eklenmesi gerekir .

Misal;

 var $foo = "something";
 echo $foo;

Bir iş uygulaması için yeni bir komut dosyası dili geliştiriyorum ve hedef kullanıcılarımın programlama geçmişi yok. Bu karakterler kodu okumayı ve kullanmayı kolaylaştırıyor mu?

PHP'nin kullanmasının bir nedeni $, onsuz PHP bir adın bir işlev başvurusu mu yoksa değişken başvurusu mu olduğunu söyleyememesidir. Bunun nedeni, dilin işlevlere garip referanslara izin vermesidir. Böylece $sembol, ayrıştırıcının ad alanını ayırmasına yardımcı olur.

Ayrıştırıcımda bu sorun yok. Yani sorum tamamen okunabilirlik ve kullanım kolaylığı. PHP'de o kadar çok kod yazdım ki gördüğümde $foobunu bir değişken olarak tanımlamak benim için kolay. Bu tanımlayıcıya önyargılı bir tercih mi veriyorum?


19
IMO, kod imza olmadan daha okunabilir
John Dvorak

6
@JanDvorak +1 bana günün yeni sözünü verdi. sigilsBugün konuşmalarda üç kez kullanmaya çalışacağım .
Reactgular

6
IMO Düzenleyicinizde sözdizimi vurgulaması olup olmadığına bağlıdır.
CodeBeard

5
Eğer kullanırsanız var $x = ...veya type $x = ...sonra $ overkill olduğunu düşünüyorum. Eğer yeni sahip olsaydınız, $x = ...yapmaya değer olabilir. Özellikle ortak editörlerde sözdizimi vurgulamayı desteklemek istemiyorsanız. Ancak, tercih olarak, sevmiyorumsigils
CodeBeard

5
imzalar zorla bir Macar notasyonu gibi
cırcır ucube

Yanıtlar:


13

Gerçek teknik olasılıklar ve sınırlamalar, bu iş parçacığında önerilen türden bir şey değildir. Önce bunları temizleyelim.

PHP'de $ mümkün kılan:

  • Değişken değişkenler
  • Anahtar kelime adına sahip değişkenler $returnveya bir değişken ve aynı işlev / sabit için aynı adı kullanabilmek;$__FILE__

$ Önekiyle ilgili olmayan sınırlamalar veya özellikler:

  • Uygulama, işlevler ve değişkenler arasındaki farkı söyleyemez.
  • PHP dize enterpolasyonu veya şablon sözdizimi
  • Gerekli değişken bildirimi

Bu, sahip olamayacağınız teknik bir neden olmadığı anlamına gelir

foo = "something";
echo foo;

veya

foo = "something";
echo "foo = $foo";
//would print
//foo = something 

Ancak sahip olamazsınız ( returnbir anahtar kelime olduğunu varsayarak )

return = "something";

Ciddi komplikasyonlar olmadan. Gibi bir önek kullansaydınız $, sorun olmazdı.

Bu bir fikir ama bir sigil programcı olmayanlar için buna değer olacağına inanıyorum çünkü anahtar kelimeler değişken adları olarak kullanmalarını sağlıyor, aksi takdirde keyfi sınırlama gibi görünecek: P


Hakkında return = "something";, C #, dil tasarlarken de kontrol edilmeye değer bir seçenek olan "bağlamsal anahtar kelimeler" e sahiptir.
luiscubal

1
@ luiscubal yazma C # şaşırtıcı bir şekilde bir sigil gerektirir, bu yüzden bu kod derlenmesi istiyorsanız, yazmak gerekir @return = "something;". İçeriğe dayalı bir miktar anahtar kelime vardır, evet, ancak içeriğe dayalı hale getirmek çok daha karmaşık bir uygulama anlamına gelir.
Esailija

7

İşaretler aslında belirli bir miktarda tip kontrolü sağladıkları perl'de çok daha mantıklıdır. Php onlar templating dışında çok yardımcı olmuyor. Farklı dillere bakarak onların kullanışlılıklarını ve okunabilirliklerini anlayabilirsiniz. Hemen hemen hiç kullanmayın.

Üzerinde çalıştığım son kullanıcı hedefli dilde, tanımlayıcıları büyük / küçük harfe duyarsız hale getirerek boşluklara ve kesme işaretlerine izin veriyorum. Bu Karl's height, doğal dillere çok daha yakın olan değişken adları yapmama izin veriyor .


1
Değişkenlerdeki boşluklar için +1, ancak bunu nasıl uygulayacağımı bilmiyorum. Okumayı daha kolay bulacağımdan emin değilim. Ben sadece buna alışmıyorum.
Reactgular

1
Fikri beğendim. Ancak, tanımlayıcıda boşluk bulunan bir dil için ayrıştırıcı yazmaktan nefret ederim. :-)At Karl's for the night = true;
Martin York

Ancak bu dili okumamıza yardımcı olmak için bir dilin tepesine eklediğimiz tüm bu standartları görmek ilginç olurdu. Harici bir araç tarafından manuel olarak kontrol edilmek yerine, dil tanımının bir parçası olun. Bu şekilde, kodlama standartlarındaki tanımlayıcı adları hakkında (dilde olduğu gibi) anlamsız argümanlara sahip olamayız.
Martin York

2
Bununla birlikte, vaka duyarsızlığının uluslararasılaşma sorunu vardır. Birçok dilden karakterlere izin verirseniz, bazı bölgelerde "aynı" olan, ancak diğerlerinde olmayan adlarla karşılaşabilirsiniz.
luiscubal

1
Değişkenlerde boşluk bırakmaya izin vermek prensip olarak önemli değildir - sadece tanımlayıcılar için birden fazla kelimeye izin veren bir dilbilgisi kuralı anlamına gelir. Ancak bu, belirsizlik yaratmadan dilbilgisinde başka şeylerin mümkün olmayabileceği anlamına gelir. Örneğin, Haskell'de, map sumkısmen uygulanan bir işlev çağrısıdır - işlev sumbir parametre olarak iletilir map. Ancak bunların her ikisi de sadece kütüphane adlarıdır, bu nedenle çok kelimeli tanımlayıcılarda, derleyici map sumbir çok kelimeli tanımlayıcı mı yoksa iki tek kelimeli tanımlayıcıya dayanan bir işlev uygulaması mı olduğunu bilemez .
Steve314

7

Yıllar önce Applesoft Basic'i öğrendim. Dizeler her zaman eklenmiş $ve diziler ek eklenmişti %. Bu dilin nasıl çalıştığıdır. Bir şeye baktın, ne olduğunu biliyordun. Tercümanın neden böyle olduğunu veya bunu yapan tasarım kararlarını anlamak için asla çok fazla araştırmadım.


Php desen (etkilenmiştir kendi Perl etkisi gelir awkve sh). Perl'deki sigil, $birçok farklı türü tanımlayabildiğinden biraz daha fazladır :

  • $ sayısal
  • @ liste
  • % esrar
  • & kod bloğu
  • * typeglob

Sigil, sembol tablosu yapısının hangi kısmına baktığınızı tanımlar. Sahne arkasında, foo ( *footypeglob aracılığıyla erişilir) için sembol tablosu girişi foo olabilecek her şeye sahiptir. Orada $foo, @foo, %foo, biçim foo , &foo, dt foo, vs ...

Bu aynı zamanda bir değişkenin diğerine takma adını oluşturmaya izin verir:

#!/usr/bin/perl

$foo = "foo";
@qux = (1,2);
*bar = \$foo;
*bar = \@qux;

print "$bar @bar\n";

Bu baskılar foo 1 2- perl'de, bu imzaların gerçekten ne için olduğunu, bunu yapmanız gerektiği değil, yaptıkları sahnenin arkasında bu var.

İşaretler okunabilirlik için çok fazla değil, daha ziyade isim alanında bir çarpışma olabilir $foove @fooolmadan (her ikisine birden sahip olamayacağı diğer dilleri karşılaştırın int foo; int[] foo;)


Okunabilirlik işaretleri, herhangi bir dilin parçası olarak öğrenilen bir şeydir - sözdizimini okuyarak. Varsayımsal olarak, tanımlayıcının bir parçası olmak için türün kendisini (Macarca gösterim olarak) zorlayabilirsiniz.

Lex satırlarında bir şey:

typeChar  [is]
capLetter [A-Z]
letter    [a-z]
digit     [0-9]
%%
{typeChar}{capLetter}(letter}|{digit})* { prientif("iddentifier");}
%%

Ve sonra kodunuz olabilir.

iFoo = 42;
sFoo = "a string";
iBar = iFoo * 2;

Bunun iyi bir fikir olduğunu söylemiyorum, aksine dile alışmış birisinin bunu doğal olarak okuyabileceğini ve okunabilirliği artırdığını düşünürken, dili bilmeyen biri sadece eklediğini düşünebilir dile bir sürü gürültü.

Ancak, bu şekilde tanımlanan bir dille çalıştıktan sonra, muhtemelen sorunsuz bir şekilde okuyabiliyordum.

Bazı insanlar onlar gibi, bazıları sevmez. Bunu tartışan çeşitli forumlarda büyük kutsal savaşlar var ve onları ne kadar kullandığınıza bağlı.

İmzacı kullanan programcı olmayanlar için yeni bir dil tasarlanabilir ve daha önce hiç programlamamış olanlar asla onlardan bir parça şikayet etmezler. Öte yandan, onları dilin bir parçası olarak alamazsınız ve daha sonra yakut veya perl programcılarının bazı önemli bilgileri kaçırdıklarından şikayet edemezsiniz.

Gerçekten önemli değil. Önemli olan, eğer kullanırsanız veya kullanmazsanız, sigillerin dile nasıl uyum sağlayacağıdır. Yapabilmek ister "123 $foo 456"misiniz yoksa yapmak zorunda "123 " + foo + " 456"mısınız? Kararın alınması gereken yer burasıdır.


1
Gibi dize enterpolasyonu "123 $foo 456"sigil öneki tarafından etkinleştirilmez ve tamamen ortogonaldir.
Esailija

1
Değişkenlerin enterpolasyonunun bir parçası ve bir ipin nasıl ayrıştırıldığına bağlıdır. Sigils yapabilir daha kolay (gösterdiği gibi başka yollar yapılabilir javascript değişken interpolasyon yapmak için en iyi yol? Ama bu Sigils, tartışmasız, yazma çok daha kolay yapabilir ve bunu anlamak çekirdek dilin parçası değildir..

1
@MichaelT Hayır, değişkenlerin önekleri olması dize enterpolasyonunun uygulanmasını kolaylaştırmaz veya zorlaştırmaz. Bunlar tamamen birbiriyle alakasız 2 şeydir. Bir insan okuyucu için, değişken önekler için zaten kullanılmışsa $asddize enterpolasyonu sözdiziminde kullanmak iyi bir seçim olabilir $, ancak ilk etapta dize enterpolasyonu uygulama olasılığı ile ilgisi yoktu.
Esailija

2
@Esailija nasıl ilgisiz olduklarını anlatabilir misiniz? Bir kenara, en.wikipedia.org/wiki/Variable_interpolation - "Değişken enterpolasyonu destekleyen diller Perl, PHP, Ruby, Tcl, Groovy ve çoğu Unix kabuklarını içerir. Bu dillerde değişken enterpolasyon yalnızca dize değişmez olduğunda gerçekleşir çift ​​tırnaklı, ancak tek tırnaklı olduğunda değil. Değişkenler tanınır çünkü değişkenler bu dillerde bir sigil (genellikle "$") ile başlar. "

@MichaelT Değişken öneklerde ve dize enterpolasyonunda kullanılan dolar sembolü tamamen yüzeysel bir seçimdir (yalnızca okunabilirlik argümanlarına sahiptir, uygulama ile ilgili bir şey değildir, #örneğin kahve dilinde kullanılan da olabilir . değişkenler #- aslında değişkenlere önek
eklemez

3

Ben PHP funcs farklılık gösterir $ kullanır kabul etmiyorum. En azından PHP'nin C benzeri sözdizimi olması ve funcs () adından sonra paren içermesi.

$ PHP neden PHP hakkında yığın taşması hakkında bu yazı okuyun .

C, C ++, C #, Java gibi birçok popüler dil $ kullanmaz ve kolay var fonksiyonundan farklı olabilir.

PHP $ 'da, örneğin şunu yazarken yardımcı olur: echo "var = $ var"

$ Olmadan böyle bir hile imkansız olacaktır.


+1 ah bu daha mantıklı. Teşekkürler.
Reactgular

3
echo "var = $var"

4
-1. PHP sözdizimi tuhaflıkları bazı gerçek sınırlamalardan değil, dilbilgisi kuralları, eğer tasarlanmışsa, son derece kötü tasarlanmış olduğundan kaynaklanmaktadır. Bu yüzden fn()[], düşünmeden bile kutunun dışında çalışacak olan mantıklı dilbilgisi olduğu yerde kesmek için hack'lere ihtiyaç duyuyorlar .
Esailija

@svidgen Evet. Dizenin hangi bölümünün bir değişkenle eşlenmesi gerektiğini belirtmenin bir yolu olmadan dize enterpolasyonunu güvenli bir şekilde yapamazsınız. Diğer diller , Python'un dize biçimlendirmesi gibi can sıkıcı / gereksiz ayrıntılar olarak gördüm . Bununla birlikte, PHP'de başka avantajlar da vardır: RuslanZasukhin, işlevlerin her zaman parenlerle gösterileceğini söylerken yanlıştır, çünkü referans olarak da iletilebilirler.
Izkata

@Izkata Bir dilde değişkenleri kullanma şeklinizin dize enterpolasyonu sözdizimi ile ilgisi yoktur. Ama bu cevapta ima edildi, dolayısıyla -1 ...
Esailija

3

Tüm bu cevaplardan sonra, Mathew Foscarini'ye biraz daha puan vermek istiyorum.

  • Sorunu şimdi bir "dil kurucu" olarak görüyorsunuz. Kendi dilinizde bir şey kullanıp kullanmayacağınızı seçmek için neden başka bir dilin bu veya bu özelliğe sahip olduğunu anlamaya çalışıyorsunuz. Uzun yıllar aynı pozisyondayım çünkü Valentina Veritabanımız için SQL ayrıştırıcısı geliştiriyoruz.
  • Antlr.org'a bir göz atmanızı ve hatta Terence'den kitap okumanızı tavsiye ederim. Dil geliştiricileri için çok güzel şeyler var.
  • Hala diğer cevapların maruz kaldığı "nedenleri" kabul etmiyorum. Başta PHP yazarının ayrılmış anahtar kelimeleri kullanabilmek ve $ değişkenleri değişken olmayanlardan daha iyi ayırt edebilmek için $ kullanmaya karar verdiklerini varsayarlar. Ben öyle düşünmüyorum ... kanıtlamak sadece kendi hikayesi olabilir.
  • Büyük olasılıkla perl ve daha erken dilleri takip ediyorlar. Terrence'in altını çizdiği gibi, çoğu dil özellikle LEXER bölümünde benzerdir. Ve genellikle yeni bir dilin kurucusu, nasıl bir dil geliştireceğini seçebilir ve daha sonra bu dil gramerinin sözlüğünü alabilir. Ve şimdi yapmanız gereken bu. Sıfırdan icat etmeye gerek yok. Ve aynı PHP yazarları yaptım bahis.
  • İnsanların bahsettikleri her şey:
    • değişkenleri değişken olmayanlardan ayır
    • değişken isimleri olarak kelime koruma
    • dizenin içine değişken yerleştirme yeteneği
    • başka olabilir (PHP büyük uzman değilim)

olan bu lexer yan etkileri , bir belirteç tanır, çünkü.

Örnek olarak: SQL'de ayrılmış sözcüklerle tanımlayıcıları ve hatta "First Name", "Group Name" boşluklu tanımlayıcıları kullanabilmek için "" kullanırız. GROUP bir anahtar kelimedir. Sorun vardı - özel bir çözüm vardı.

PS MichaelT çok iyi bir yorum.


Harika bağlantı için +1 teşekkürler. Bunu kullandım, ancak bağlantınız çok daha iyi görünüyor. goldparser.org
Reactgular

Bağlantınız için de teşekkür ederim. Bu altın ayrıştırıcısını daha önce görmedim. Ayrıca ilginç görünüyor.
Ruslan Zasukhin

@RuslanZasukhin Eğer cevabımla ilgili bir atıfta bulunuyorsanız, geliştiricinin anahtar kelimeleri etkinleştirmenin amacı olduğunu söylemedim. Sadece değişkenler gibi anahtar kelimeler kullanmanın, değişkenler gibi bir sembolle önek eklendiğinde teknik olarak mümkün olacağını söyledim $. Ayrıca, "değişkeni dizginin içine yerleştirebilme" , değişkenlerin öneki gibi bir sembolle işaretlenmesinden kaynaklanmaz $. Yani, "123 $foo 456"değişken sözdizimi foo = 3veya gibi olsa bile çalışır @foo = 3. Birbirleriyle ilişkili değiller.
Esailija

3

... bir sigil şunları sağlar:

  • Değişkenleri değişken olmayanlardan daha iyi ayırt edin . Hala temel kavramları öğrenen insanlar hangi kelimelerin değişken hangilerinin değişken olduğunu anlamakta zorluk çekebilirler. Genellikle yeterli arkaplanı olmayan örnekleri veya başkalarının kodlarını okuyarak başlarlar.

  • Değişken adları olarak ayrılmış anahtar kelimeler veya işlev adları kullanın . Bazen bu isimlerden bazılarını bir değişken için doğru isimler olarak buldum (yani bir fonksiyon tanımlanmışken) ve bunları kullanmama izin verdikleri için teşekkürler. $countcount()

Ayrıca ben bir işlev sonucunu bir değişken değişken, örneğin tutmak için, sık sık yeniden işlev adı yapmak :

$isdir=isdir($dir);

if(/* complex condition implying $isdir */) {
/* etc */
}


1
ZHR, daha iyi ne demek? C ++ 'da tüm değişkenlerimizi $ olmadan yazıyoruz ve mükemmel ve kolay bir şekilde ayırt ediyoruz. Örnek: {int z = 0; z = 55; z (Z); } Ve C ++ 'da atamak gerekirse işlev adını da kullanabiliriz, örneğin işlev gösterici.
Ruslan Zasukhin

@RuslanZasukhin, Bilgisayar okuryazar değil, biraz biliyor musun? Onlara C ++ öğretmeyi deneyin, şaşıracaksınız.
ZJR

Ayrıca: Bir sigilin her zaman bir $işaret olması gerektiğini düşünmüyorum . Doðu iþaretini, doðrudan para birliði nedeniyle çocukken kafamý karýþtýrýyorum. %uygulanabilir bir alternatif olabilir.
ZJR
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.