CSS ve SVG'lerde neden çok sayıda sihirli sayı kabul edilebilir?


63

Çoğu zaman ben gibi sıcak Ağ Sorular listesinde soruları görmek bu temelde "CSS bu keyfi şekil çizmek nasıl" sorun. Değişmez bir şekilde cevap, talep edilen şekli oluşturan rasgele kodlanmış birkaç değer içeren bir grup CSS veya SVG verisidir.

Buna baktığımda 'Yuck! Ne çirkin bir kod bloğu. Umarım projemde bu tür şeyleri hiç görmemişimdir '. Bununla birlikte, bu tür soru-cevap türlerini oldukça sık ve çok sayıda yükselme ile görüyorum, bu yüzden toplum açıkça kötü olduklarını düşünmüyor.

Fakat bu neden kabul edilebilir? Son deneyimimden geldiğimde bu bana bir şey ifade etmiyor. Peki neden CSS / SVG için uygun?


38
Güzel görünen bir rastgele sayıdaki sihirli sayı (2 (x, y) noktaları veya piksel dizileri arasındaki vuruşları düşünmeyin) değilse, çizim nedir?

68
CSS değişkenleri var mı? SVG yapar?
Oded

36
Bu nedenle birçok büyük projede, SASS veya LESS gibi değişkenleri destekleyen bir CSS işlemcisi vardır.
Ixrec

2
@Oded CSS için değişkenler için bazı% 40 küresel destek vardır (bu nedenle, tüm Microsoft ziyaretçilerinize karşılamadıklarını söylemek istemediğiniz sürece önerilmez). Microsoft muhtemelen Edge'deki trendi takip edecek ve mobil cihazlar sonunda yetişecek. Öte yandan SVG, bazı eski taslak statü belgelerinde değişkenler kavramına sahiptir, ancak muhtemelen hiç uygulanmayacaklardır.
phyrfox

12
Neden? Çünkü onlar sihirli sayılar değil. CSS, talimatları içeren bir programın aksine verileri tutar. Her ne kadar CSS tartışmalı bir şekilde tamamlanmış olsa da, bir programlama dili değildir.
Derek 功夫 會 功夫

Yanıtlar:


118

İlk olarak, programlamada değişkenler veya sabitler kullanılarak sihir değerlerinden kaçınılır. CSS değişkenleri desteklemiyor, bu yüzden sihirli değerler üzerine kaşlarını çatmış olsa bile, fazla seçeneğiniz yok (SASS olarak önişlemci kullanmak dışında, ancak bunu tek bir pasaj için yapmazsınız).

İkincisi, değerler CSS gibi bir alana özgü dilde sihirli olmayabilir. Programlamada, sihirli sayı, anlamın veya amacın açık olmadığı bir sayıdır. Bir satır diyorsa:

x += 23;

"Neden 23" diye soracak mısın? Sebep nedir? Bir değişken niyeti netleştirebilir:

x += defaultHttpTimeoutSeconds;

Bunun nedeni, yalnız bir sayının genel amaçlı kodda kesinlikle bir şey ifade edebilmesidir. Ancak, CSS’yi düşünün:

background-color: #ffffff;
font-size: 16px;

Yükseklik ve renk sihir değildir, çünkü anlam bağlamdan tamamen açıktır. Tasarımcının iyi görüneceğini düşündüğü için spefik değeri seçmenin nedeni basit. Bir değişkeni tanıtmak hiçbir şeye yardımcı olmaz, çünkü yine de " defaultBackgroundColor" ve " defaultFontSize" gibi bir şey adlandırırsınız .


16
Bazı değerler gerçekten sadece “iyi görünüyorlar” nedeniyle seçildi. Ancak, OP bağlantısı verilen örnek birkaç kez aynı değeri içerir, ancak aynı şeyi temsil ettikleri veya tesadüf esasına göre aynı değere sahip oldukları açık değildir. Ayrıca, değeri 198pxbaşka bir şeyin ( 200px) ve bir 2pxsınırın büyüklüğünün farkı olan bir değer kullanır .
CodesInChaos

1
@CodesInChaos: Evet, değişkenlerin veya bir tür bağımlılık ifadesinin havalı olacağı bazı durumlar vardır.
JacquesB

21
CSS Not yapar destek değişkenleri
phihag

28
evet, özellikleri ise @phihag fakat vahşi sağ söyleyerek. Ancak, konum "yaygın olarak desteklenen" olarak, çok değil (Bu yorumun anda% 40 küresel destek düşünmüyoruz, o içinde gelecek , biz CSS değişkenleri olacak Ve bunun için çok teşekkürler, yeni bugün bir şey öğrendin..
phyrfox

2
@JaredSmith Göreceli olarak büyük ölçekli bir webapp için sorun değil, ancak büyük bir polyfill içeren genel (belki de statik) sayfalar için fazla kullanılır.
Derek,

81

Kabul edilebilir, çünkü bu formatlar kod değil veridir . Tüm "sihirli sayıları" kaldırırsanız, aslında her etiketi kopyalar ve saçma görünümlü dosyalara sahip olursunuz:

mainkite_width = 200px
...
.mainkite {
  width: mainkite_width;
  ...

Bazı verileri değiştirmek istediğiniz her zaman, iki yere bakmanız gerekir. Kabul edilirse, sık sık tekrarlanan bir renginiz varsa ve temaları değiştirmek için değiştirmek isteyebilirsiniz gibi, yinelemeden kaçınmanın iyi olduğu durumlar vardır. Bu durumları ele almak için ön işlemciler ve önerilen uzantılar vardır, ancak genel olarak, yapıyla birlikte bir veri biçiminde sayıların olması arzu edilir.


22
+1 çünkü: "Bu formatlar kod değil, veri olduğu için kabul edilebilir."
Pieter B

1
“Kabul edilirse, sık sık tekrarlanan bir renginiz varsa ve temaları değiştirmek için değiştirmek isteyebilirsiniz gibi, yinelemeden kaçınmanın iyi olduğu durumlar vardır.” - Muhtemelen yine de derslerle daha iyi yapılıyor : .main_color { color: .. }ve bu sınıfı kullanmak tekilleştirme yöntemidir
Izkata

Bir uygulamanın görünüşünü ve verdiği hissi belirleyen kod hala veridir, koddur.
ESR

26

Büyü sayıları yasağı bu tasarım ilkesinin ilkel versiyonudur:

Kararları tek bir yerde alın .

Ancak bunlar sihirli sayılar değil . En azından bildiğim kadarıyla kodlama stilinde bir rehber söz konusu değil.

genişlik: 200px;
yükseklik: 200px;

Açıkça etiketlenmişler. Tabii, sayılar aynı oluyor. Ancak genişlik genişlik ve yükseklik yüksekliktir. Bağımsız değişmek üzere tasarlanmıştır.

Şimdi hepiniz 5 nesneleri varsa vardı aynı genişliğe sahip ve her biri bağımsız sana nasıl döverdi genişliklerini kodlanmış indirection sopa.

Etiketlenirlerse onlara sihirli sayılar demem ama yine de seni dolaylı çubukla yenerim.


4
Bir değişkene ihtiyaç duymak için yeterli nesneniz varsa, yeni bir sınıf oluşturmak için yeterli nesneniz vardır.
Jaketr00

1
En iyi cevap budur, konuyu gösterdiği gibi: Bunlar sihirli sayılar değil.
TheBlastOne

2
"5 nesnenin hepsinin aynı genişliğe sahip olması ve her birinin bağımsız olarak genişliğini kodlaması gerekiyordu, sizi bir sopayla döveceğim." Web tasarımının eğlenceli dünyasına hoş geldiniz.
whatsisname,

2
Büyü sayıları sadece “tek bir yerde karar ver” (yani DRY) nedeniyle değil, aynı zamanda anlaşılması zor olduğu için problemlidir.
sleske

Bir sopayla dövülmenin bir alternatifi var mı?
djechlin

11

CSS bir programlama dili olmadığından, programınız için değişken verileri içeren yapılandırma dosyasıdır.

Şu anda CSS o kadar güçlüdür olabilir aslında program, ama bu noktada dışında olduğunu. Özünde hala bir stil sayfası dili .

Geri bir adım atalım. Bir ekranda çizebilecek bir programlama diline sahip olduğumuzu hayal edin. Bir web sayfasını boyamak için programlamak istediğimizi hayal edin.

İlk başta kodumuza tonlarca sihirli sayı girecektik. Kenar boşluğu genişliği, metin yüksekliği, girintiler vb.

jump(100) // The margin
drawTable(500, 500)
writeText("Hello World", 12)

Böylece sihirli sayıları çıkardık ve onları dosyamızın üstüne koyduk.

int margin = 100
int table = 500
int text_size = 12
jump(margin) // The margin
drawTable(table, table)
writeText("Hello World", text_size)

Şimdi bu biraz çirkin. Değişken numaralarımızı bir yapılandırma dosyasından okumayı tercih ediyoruz.

margin 100
table 500
text size 12

Mm, bu biraz belirsiz ... Bu sayılar ne anlama geliyor? Bu isimler ne anlama geliyor? Biraz resmileştirelim.

margin_left 10em
table_width 500px
table_height 500px
font_size 12px

Fakat biliyorsunuz, programımızı biraz daha genişletmek istiyoruz. Ayrıca birden fazla tablo içeren sayfaları, tablo olmayan sayfaları, paragraf veya düğmeleri olan sayfaları ve daha fazlasını çizmesini istiyoruz. Konfigürasyon dosyalarımıza seçiciler ekleyelim, böylece hangi paragrafın daha büyük bir fontu veya farklı bir metin rengine sahip olacağını belirleyebiliriz, belki iç içe geçmiş elemanları destekleyebiliriz, belki de yapılandırma dosyamızda genel bir özellik kullanabiliriz ve sonra belirli bir kodla geçersiz kılabiliriz birkaç iç içe elemandan biri.


Bunun nereye gittiğini hissediyorsunuz, sonunda CSS olarak geliyorsunuz. (Ve bunu yapmak için bir tarayıcı.)

Daha sonra, sihirli dosyalardan tekrar kaçınabilmemiz için konfigürasyon dosyamıza yetenekler eklemeli miyiz? Değişkenler ekle? CSS dosyamız için bir yapılandırma dosyası ekleyin? Bizim CSS dosyası hatırlarsanız Biraz anlamsız geliyor ise zaten çok aynı yapılandırma dosyası.

Ancak bu elbette doğru değil; CSS dosyanız daha büyük ve daha büyük bir şekilde büyüyor ve sonuçta orijinal sihir sayıları ile aynı sorunlara, aynı yerde her yerde tekrarlanan aynı sayıya, bazen küçük bir dönüştürmeye vb. maruz kalıyorsunuz

Bununla birlikte, modern CSS, bu tekrarı önlemek için birçok yol sunar. Birçok öğeye uygulanan sınıfları kullanabilir, herkes için stil ayarlayabilir div, ancak sonradan birini geçersiz kılabilir ve CSS 3 bir çeşit değişken kullanımına bile izin verebilir .

Bu, CSS değişkenini her olası konumda kullanmaya başlamanız gerektiği anlamına gelmez. Mantıklı olduğu yerlerde kullanın ve çoğaltmayı engellediğiniz yerlerde veya diğer tekniklerin de yetersiz kaldığı yerlerde kullanın.

Sonunda, yapılandırma dosyanızda çok fazla sihirli sayı istemezsiniz :-)


Fazlalığın nerede olduğu neden önemlidir? Bakım nerede olursa olsun sorun olmayacak mı?
Peter Mortensen,

@PeterMortensen Bu, düşük geliştirme süresi veya yüksek bakım kolaylığı arasında daima göz önünde bulundurulur. Yüksek yedekliliğin geliştirilmesi kolaydır çünkü burada ve oradaki işleri hızlı bir şekilde değiştirebilirsiniz, düşük bir artıklık bakım nedeniyle kolaydır, çünkü küresel stili hızla değiştirebilirsiniz. Uygulamada, ikisi arasında bir yerde olmak istiyorsunuz, çünkü bununla yüzleşmek, global bir stile sahip olmak, yeni sayfalar eklemeyi daha da kolaylaştırıyor, ancak her son gizlenme özelliğine sahip olmak, olası herhangi bir global stil değişikliğinin gelişmesi sonsuza dek sürüyor.
Dorus

CSS'nin her iki yönde de özellikleri var. Ayrıca, fazlalığı azaltmak ve sürdürülebilirliği artırmak için ne kadar zaman harcayacağına ya da yeni sayfalar / özellikler çıkarmak için ne kadar zaman harcayacağına karar vermek web geliştiricisine kalmıştır. Yeterince ilginç olan, aynı şey, mükemmel tasarımı hazırlamak için ayları harcayabileceğiniz veya programınızı çökertmek için günleri ve imkansız hataları avlamak için ayları geçirebileceğiniz diğer programlama dilleri için de geçerlidir.
Dorus

Yeterince ilgi çekici olan, bu soruya henüz çok fazla soyutlama yapmayı ve hem sürdürebilirliği hem de geliştirme zamanını kaybetmeyi söyleyen bir soru sordum .
Dorus,

5

Neden [görünüşte rastgele sabit kodlanmış değerlerden oluşan bir demet] CSS / SVG için Tamam?

Tamam değil. Bu var olası düz ".css" dosya yazmak ve korumak için, ama sonunda rastgele kodlanmış değerleri yaygın yük haline gelecektir.

Son derece basit web sayfalarından başka bir şey için, disiplinli bir "bul ve değiştir" stratejisi geliştirmeniz veya değişkenleri olan bir CSS işlemcisi kullanmanız veya JavaScript aracılığıyla stilleri tanımlamanız gerekir.

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.