Dinamik olarak yazılmış dillerde neden numaralara ihtiyacımız var?


32

Burada bazı kodlar okuyordum ve html etiketlerinin adlarını saklamak için bir numaralamanın kullanıldığını gördüm. Bunu neden yapmamız gerekiyor? Bu stratejiyi kullanmanın ne yararı olur?

Enums'lerin ne kadar yararlı olduğunu derlenmiş ya da statik olarak yazılmış dillerde biliyorum ama dinamik olarak yazılmış dillerde enums gördüğümde, yukarıda gösterdiğim örnek kod gibi ben de merak ediyorum. Öyleyse, soru temelde neden dinamik olarak yazılmış bir dilde numaralara ihtiyacımız var veya hiç ihtiyacımız var mı?


38
Bu soru temel olarak "Neden türlere ihtiyacımız var" dır .
kullanıcı11153,

1
Depoda nasıl adlandırıldığını görmek için arama yaptınız mı? Bu size aldığınız cevapları daha iyi anlamanızı sağlayacaktır.
RubberDuck

varsa: enum People { YOU, NPC, FOO, BAR }ve (Kişiler) isteyen bir işlev intvarsa, sayı kullanmak yerine ne varsa ekleyebilirsiniz.
Evan Carslake,

3
Herhangi bir dilde, bu belirli "enum" un amacını veya genel olarak hinelerin amacını mı soruyorsunuz? Eski
olanı

Yanıtlar:


56

Bunun bir yararı, derleyicinin yanlışlıkla "ADRES" veya "FEILDSET" yazıp yazmadığınızı ve çalışma zamanında saçma bir şekilde davranmak yerine derhal düzeltmenize izin vermesidir.

Fayda, statik olarak yazılmış dillerde dinamikten çok daha kullanışlı olsa da, verileriniz yerine case ifadenizle ilgili bir sorun olduğunu belirten bir mesaj alacağınız için çalışma zamanı hatası olsa bile yine de kullanışlıdır.


4
@amon: yapabilirsin, ama enums, çarpışmaların olmaması için sana kullanışlı bir mekanizma verir.
whatsisname,

75
Yerine çeteleler kullanımı dize sabitleri, kötü editör yazı tipleriyle birinin parlak fikir kaynaklanan bir hata kovalayan bir ay boyunca bir kez işin için kullanılan bir yer I ve yanlışlıkla adında bir alan"PROF1LE_"
Gort Robot

8
@ amon Go tam olarak bunu yapar. Bununla birlikte, enums ile ilgili güzel bir şey, derleyicinin, switch ifadenizin olası her enum değeri için bir durum olduğunu kontrol edebilmesidir.
weberc2

15
Bu kod 80'lerde yazılmıştır. Bunu fark etmeyebilirsiniz, ancak bu, bazı geliştiricilerin tek bir anahtarı olmayan fiziksel daktilolar üzerinde geliştirmeyi öğrendikleri bir dönemdeydi . Aslında söz konusu dizginin "Profi1e" olduğunu fark etsem de ... yirmi beş yıl oldu, bu yüzden hafızam kesinlikle kusursuz değil.
Robotu

4
@DarrelHoffman: Şaşırmana şaşırdım. Perl, ben sık sık kendimi yazmaya bulmak $1demek zaman $i. (Kabul, ben yazdıkça asla f1leyerine file- $1hata gerçeği ile dolana $1Perl çok yaygındır -. Ama yine de, her türlü hatalar yaygındır Belki dev bir parola vardı prof1leonun içinde, bu suretle yanlış yazmanız onları astar profileşifre bağlamında bağlamında.)
ruakh

22

Enums, mantıklı olan sabit bir değerler / varlıklar kümesinin olduğu durumlar için kullanışlıdır. Kendilerini belgeliyorlar ve derleyicinin çalışma zamanına bırakılacak şeyleri doğrulamasına izin veriyorlar. Anlamlı değerler kümesi bilinmese veya kesin olarak sınırlı değilse, asla kullanılmamalıdır.

Daha faydalı bir örnek, HTTP yanıt kodları gibi bir şey olabilir. Sayıları alan ve hatanın adını ve / veya açıklamasını sağlayan bir yönteme sahip olmak yerine, hangi değerler konusunda yetkili olan tek bir temiz pakette anlamlı adlar, bir kod ve bir açıklama vb. İçeren bir sayılar kümesi olabilir. izin verilir ve kullanılması gerekir.


1
“Kendini belgelemek” en önemli kısımdır. Eğer Ben daha çok kontrol ediyorum status === GEOLOCATION_ACQUIREDdaha status === 3o yazılım bakımını yapan biteni anlar böylece. Dediğiniz gibi, geçersiz değerleri de önler.
Nicolas Bouliane

11

Satırların OOP ile ilgisi yoktur ve JavaScript'in sayıları yoktur. Bunun yerine, sabit bir değerler kümesi arasında bir seçim olduğunda, enums'ler kullanılır. Örneğin, bir boolean olarak uygulanabilecek doğru ve yanlış arasında bir seçimdir enum Bool { False, True }. Bir GUI kütüphanesinde, biz Hizalanmaları bir enum sahip olabilir: enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 }.

Enum'un nasıl uygulandığı genellikle önemli değildir, önemli olan her olası değerin farklı olmasıdır. Pek çok dil, Java gibi bazıları rastgele nesneleri desteklese de, enums'ler için tamsayılar kullanır.

Şimdiye kadar, örneğin sabitler de kullanabilirdik const int LEFT = -1, CENTER = 0, RIGHT = 1. Ancak, bir derleyici enum değerlerinin birbirine ait olduğunu bilir. Bu yüzden enum değerlerini değiştirdiğimde switch(value) {case LEFT: ...; case RIGHT: ...;}, derleyici CENTERdavayı unuttuğum konusunda beni uyarabilir . Bu önemli bir zaman tasarrufu olabilir. Numaralandırmalı veya anahtarsız yapılı olmayan dillerde, statik yazmanın varlığında daha faydalı olmasına rağmen, Ziyaretçi Deseniyle simüle edilebilir.

Diğer bir avantaj ise, çukurların ayrı bir tip olarak ele alınabilmesidir. Örneğin, bir yöntemin HAlignmentherhangi bir tamsayı yerine bir parametre aldığını ilan edebilirim . O zaman üç olası HAlignment değerinden biri dışında bir şey sağlarsam kod derlenemez. Bununla birlikte, C'nin enumları enkapsüle edilmemiştir ve enum sabitleri tamsayılarla değişimli olarak kullanılabilir. Diğer diller burada daha katıdır.

JavaScript’te bu avantajlardan hiçbirini alamıyoruz. Verilen örnek, enum olarak kabul edilen bir nesneyi bildirir. Bunun programcı için bazı avantajları vardır, örneğin dokümantasyonu kolaylaştırır, tüm “sabitleri” tek bir nesneye gruplandırır,…. Ancak, böyle bir nesnenin enum benzeri olduğu yalnızca bir kuraldır.

Buradaki nokta, HTML'nin yalnızca sınırlı ve bilinen bir etiket kümesine sahip olmasıdır. HTML5 teknik özelliklerine bakabilir ve bu öğe adlarını kodunuza bir enum olarak koyabilir ve bu nedenle <blink>programınıza bir etiket gizlice sokmayı zorlaştırabilirsiniz . Bu bilgiyi tek bir yerde kodlamak, kodunuzu özel dizgi değişmezleri (veya daha kötüsü, sihirli sayılar) ile karıştırmak için daha iyidir.


Bu durumda <blink>, javascript'te bazı metotlara geçersem hiçbir şey beni durduramaz mı? ama javamerhaba gevşek kırılıyor :)
CodeYogi

@CodeYogi evet, çünkü JS statik tip bir sisteme sahip değil ve özellikle enum tip konseptine sahip değil. Bununla birlikte, bir yöntem parametresini, bir programcının onu foo(TagName.STRONG)biraz daha iyi olduğu için çağırmasına neden olacak şekilde “TagName alır” olarak belgeleyebilirim . Alan yoksa JS şikayet ediyorum verirsen, daha iyi olurdu, ama burada biz sadece bir olsun undefinedDenersem TagName.BLINK. JS'de buna değmez, ama bir başlangıç.
00:

Hmm, yukarıda bahsettiğim kod linki kapatma derleyicisini kullanıyor, bu yüzden orada mantıklı geliyor.
CodeYogi

Clojure işlevsel bir dildir, bu nedenle OOP'un soruyla ne kadar alakalı olduğundan emin değilim, ama bu bir yana, genellikle sadece bir tamsayı dizisi olan (OO değil) ve OO olan 'Typesafe enum' kalıbı arasındaki ayırımları ayırmak önemlidir. ve Java'nın desteklediği şey.
JimmyJames

Ben Clo hakkında, JS bahsediyorum @JimmyJames j (Java platformu üzerinde çalışan, aynı zamanda bir dereceye kadar OOP destekler) ure. Soru oop ile etiketlendi , bu yüzden başlangıçta bunu söyledim. Gerçekten türgüvenli çeteleler sadece bir tür sistem özelliği olduğunu, OOP bağlı nasıl görmüyorum (birçok sivil cepten dilleri tip sistemler :-) var)
amon

3

Diliniz derleme gerektirmese bile, muhtemelen sadece dizelerden daha enum gibi bir şey için daha iyi destek verebilecek bir çeşit IDE veya geliştirme aracı kullanacaksınız.

Örneğin javascript'te bir enum benzeri nesne değişmezi kullanıyorsanız, editörünüz size kod tamamlama verir ve yanlışlıkla yanlış değer kullanırsanız JSHint veya JSLint gibi kod denetleyiciniz sizi uyarır.


Bence diğer tepkilerin çoğu ya bu noktayı kaçırıyor ya da atıyor. 'Emum'u dinamik bir dilde kullanmak derleyici için hiçbir şey yapmaz, ancak bazı IDE'lere, dokümantasyon araçlarına gerçekten yardımcı olabilir ve ayrıca kodu anlamaya çalışan insanları da unutmaz.
Robert

2

Böyle bir numaralamanın amacı Js Api'ye (goog) izin verilen etiketlerin bir setini / demetini sağlamak olabilir. Hangileri? W3C HTML 4.01 tarafından tanımlananlar ( enum'un belgelerine bakın ). Bu yüzden ayar sınırları.

Gerçek amaç bu olabilir veya olmayabilir, ancak bu amaç için iyi sonuç verir.

Javascript'in nasıl çalıştığını biliyorsanız, hangi kodun yapılacağı, stringler :-) ile indekslenmiş bir dizi tanımlamaktır. Hangi değer bir dizedir, ancak özniteliklere, işlevlere vb. Sahip başka bir bileşen olabilir. Hayal gücünüzü serbest bırakın ve her yerde fayda göreceksiniz.

Javascript bir yana, devlet makinalarını modellemek ve yönetmek için enums kullanıyorum .

BAŞLANGIÇ> IN_PROGRESS> ONAYLANMIŞ> BİTİR>> ...

Java anahtarında , kuyuların durumları bir durum makinesinde doğrulamak , enum boyunca döngü oluşturmak, karmaşık kuyular yaparak öncelikler tanımlamak oldukça kolaydır ...

Bunları ayrıca yazılı ve değiştirilemez sabitleri tanımlamak için de kullanırım:

  • Evet Hayır

Ayrıca karmaşık numaralandırmalar (güvenli dönüşümler / ayrıştırıcılar yapmayı sağlar)

  • Evet (1, doğru), Hayır (0, yanlış)

Enums'ler genellikle model katmanıma (çekirdek) ait olduğundan, özelliklerine tüm sisteme erişilebilir, bu yüzden işlevsel bir model haline geliyor ve düşük bir bağlantı tutuyorum.

Enums'ın verdiği şey (diğer şeylerin yanı sıra) sınırlar ve sınıflandırma

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.