İçeriğe geç
academia.sh

Ders 05 / 19

Tasarım Dili

Tasarım ilkelerinin ayırt edicilik testiyle sınanması, ilke–karar matrisinden boşta ilke ve dayanaksız karar çıkarımı, ilke çatışmalarının okunması ve ses tonu sözleşmesinin denetlenmesi.

İçindekiler

Önceki dört ders sistemin sayısal iskeletini kurdu: kapsam, gerekçe, envanter ve ölçek. İskelet neyin kullanılabileceğini söylüyor, hangi seçeneğin doğru olduğunu söylemiyor. Aynı aralık ölçeğiyle iki ayrı arayüz kurulabilir; biri yoğun ve sessiz, diğeri ferah ve yönlendirici olur. İkisi de ölçeğe uyar.

Tasarım dili (design language), ölçeklerin bıraktığı bu boşluğu dolduran karar dayanaklarıdır: ilkeler, ses tonu ve marka ifadesi. Bu dersin sorusu, bu dayanakların denetlenebilir olup olmadığıdır. Bir ilke ancak bir seçeneği reddedebiliyorsa ilkedir; bir ses tonu ancak ihlali gösterilebiliyorsa sözleşmedir.

İlke, Tersi Savunulabilen Cümledir

Bir tasarım ilkesinin işi karar verdirmektir. Karar verdirmenin ölçütü şudur: ilkenin tersi de savunulabilir bir konum olmalıdır. “Kullanıcıyı önemseriz” bir ilke değildir, çünkü tersini savunan kimse yoktur; hiçbir seçeneği elemez, dolayısıyla hiçbir tartışmayı kapatmaz. “Kayıt önce, araç sonra” bir ilkedir, çünkü tersi — arayüzün önce kendi araçlarını göstermesi — gerçekten savunulan bir konumdur.

Aynı ölçüt tutarlılık için de geçerlidir. Yinelenme ve Tutarlılık dersinde tutarlılığın değeri gösterildi, ama tutarlılık bir tasarım ilkesi değildir; sistemin varlık koşuludur. İlkeler sistemin içinde hangi seçeneğin alınacağını belirler.

İkinci ölçüt ilkenin kararlara değdiğinin gösterilmesidir. Aşağıdaki program iki denetimi birden yapar: ilkeleri tersinin savunulabilirliğiyle sınar ve ilkelerle kararlar arasındaki örtüşmeyi çıkarır. Üçüncü blokta ses tonu sözleşmesi denetlenir.

// dil.mjs — tasarim ilkelerinin ayirt ediciligi, ilke-karar ortusmesi ve ses tonu denetimi

// 1) Ayirt edicilik: bir ilkenin tersi savunulabiliyorsa ilke bir karar verdirir.
// "tersi" alani, ilkenin karsitinin yazili halidir; savunulabilir alani insan degerlendirmesidir.
const ILKELER = [
  { ad: "kayit once", tersi: "arac once", savunulabilir: true },
  { ad: "sessiz arayuz", tersi: "yonlendiren arayuz", savunulabilir: true },
  { ad: "geri alinabilirlik", tersi: "onaya dayali koruma", savunulabilir: true },
  { ad: "yogun liste", tersi: "ferah liste", savunulabilir: true },
  { ad: "kullaniciyi onemseriz", tersi: "kullaniciyi onemsemeyiz", savunulabilir: false },
  { ad: "tutarli olmak", tersi: "tutarsiz olmak", savunulabilir: false },
  { ad: "erisilebilirlik pazarlik disi", tersi: "erisilebilirlik ozellige gore", savunulabilir: true },
];

console.log("ilke                           tersi                          ayirt edici mi");
for (const i of ILKELER) {
  console.log(`${i.ad.padEnd(30)} ${i.tersi.padEnd(30)} ${i.savunulabilir ? "evet" : "HAYIR"}`);
}
const ayirtEdici = ILKELER.filter((i) => i.savunulabilir);
console.log(`ayirt edici ilke sayisi: ${ayirtEdici.length} / ${ILKELER.length}`);

// 2) Ilke-karar matrisi. Her karar icin hangi ilkenin hangi yonde etki ettigi yazilir.
// yon: +1 karari destekler, -1 karsi cikar.
const KARARLAR = [
  { ad: "kayit basligi kapak gorselinden buyuk", etki: { "kayit once": 1, "yogun liste": 1 } },
  { ad: "sonuc listesi yogun dizilir", etki: { "yogun liste": 1, "sessiz arayuz": 1 } },
  { ad: "odunc alma tek tiklamayla, geri alinabilir", etki: { "geri alinabilirlik": 1, "sessiz arayuz": 1 } },
  { ad: "kayit silme onay ister", etki: { "geri alinabilirlik": -1, "sessiz arayuz": -1 } },
  { ad: "suzgec paneli her zaman acik", etki: { "yogun liste": -1, "kayit once": 1 } },
  { ad: "odak gostergesi her bilesende", etki: { "erisilebilirlik pazarlik disi": 1 } },
  { ad: "bos durumda oneri listesi gosterilir", etki: { "sessiz arayuz": -1 } },
  { ad: "kapak gorselleri kucuk kucuk resim olarak", etki: { "kayit once": 1, "yogun liste": 1 } },
  { ad: "ust menu sabit kalir", etki: {} },
  { ad: "sayfalama yerine surekli akis", etki: {} },
];

console.log("\nilke                           destekledigi  karsi ciktigi  toplam");
for (const i of ILKELER) {
  const arti = KARARLAR.filter((k) => k.etki[i.ad] === 1).length;
  const eksi = KARARLAR.filter((k) => k.etki[i.ad] === -1).length;
  console.log(
    `${i.ad.padEnd(30)} ${String(arti).padStart(12)} ${String(eksi).padStart(14)} ${String(arti + eksi).padStart(7)}`
  );
}

const bostaIlke = ILKELER.filter((i) => !KARARLAR.some((k) => i.ad in k.etki));
const dayanaksiz = KARARLAR.filter((k) => Object.keys(k.etki).length === 0);
const catisan = KARARLAR.filter((k) => {
  const y = Object.values(k.etki);
  return y.includes(1) && y.includes(-1);
});
const gerilim = KARARLAR.filter((k) => Object.values(k.etki).every((v) => v === -1) && Object.keys(k.etki).length > 0);

console.log(`\nbosta kalan ilke (hicbir karari belirlemedi): ${bostaIlke.map((i) => i.ad).join(", ") || "yok"}`);
console.log(`dayanaksiz karar (hicbir ilkeye baglanmadi): ${dayanaksiz.map((k) => k.ad).join(", ") || "yok"}`);
console.log(`ic catisma tasiyan karar: ${catisan.map((k) => k.ad).join(", ") || "yok"}`);
console.log(`ilkelere ragmen verilmis karar: ${gerilim.map((k) => k.ad).join(", ") || "yok"}`);

// 3) Ses tonu sozlesmesinin denetimi. Kurallar denetlenebilir olmak zorundadir.
const METINLER = [
  { yer: "arama bos sonuc", metin: "Aramaniz sonuc vermedi. Yazar adiyla ya da ISBN ile arayin." },
  { yer: "odunc basarili", metin: "Odunc alindi. Son teslim 12 Mart." },
  { yer: "odunc hatasi", metin: "Uzgunuz, maalesef bir hata olustu. Lutfen tekrar deneyin." },
  { yer: "gecikme uyarisi", metin: "Teslim tarihi gecti. Uzatmak icin uzat dugmesini kullanin." },
  { yer: "alan dogrulama", metin: "Gecersiz giris yaptiniz." },
  { yer: "silme onayi", metin: "Kayit silinecek. Bu islem geri alinamaz. Silmek icin onaylayin." },
  { yer: "raf bos durumu", metin: "Bu rafta kayit yok. Kayit eklemek icin rafi secip ekle dugmesini kullanin ve ardindan listeden bir eser secin." },
];

const YASAK = ["uzgunuz", "maalesef", "gecersiz", "yaptiniz", "lutfen"];
const EYLEM_FIILI = ["arayin", "kullanin", "onaylayin", "secin", "deneyin", "ekleyin"];
const EN_COK_KELIME = 14;

console.log("\nyer               kelime  yasak sozcuk             eylem  unlem  sonuc");
let ihlalli = 0;
for (const m of METINLER) {
  const kucuk = m.metin.toLowerCase();
  const kelime = m.metin.trim().split(/\s+/).length;
  const yasak = YASAK.filter((y) => kucuk.includes(y));
  const eylem = EYLEM_FIILI.some((f) => kucuk.includes(f));
  const unlem = m.metin.includes("!");
  const ihlaller = [];
  if (kelime > EN_COK_KELIME) ihlaller.push("uzun");
  if (yasak.length) ihlaller.push("yasak");
  if (!eylem) ihlaller.push("eylemsiz");
  if (unlem) ihlaller.push("unlem");
  if (ihlaller.length) ihlalli++;
  console.log(
    `${m.yer.padEnd(17)} ${String(kelime).padStart(6)}  ${(yasak.join(",") || "-").padEnd(23)} ` +
      `${(eylem ? "var" : "YOK").padEnd(6)} ${(unlem ? "var" : "-").padEnd(6)} ${ihlaller.join("+") || "gecti"}`
  );
}
console.log(`ihlal tasiyan metin: ${ihlalli} / ${METINLER.length}`);
ilke                           tersi                          ayirt edici mi
kayit once                     arac once                      evet
sessiz arayuz                  yonlendiren arayuz             evet
geri alinabilirlik             onaya dayali koruma            evet
yogun liste                    ferah liste                    evet
kullaniciyi onemseriz          kullaniciyi onemsemeyiz        HAYIR
tutarli olmak                  tutarsiz olmak                 HAYIR
erisilebilirlik pazarlik disi  erisilebilirlik ozellige gore  evet
ayirt edici ilke sayisi: 5 / 7

ilke                           destekledigi  karsi ciktigi  toplam
kayit once                                3              0       3
sessiz arayuz                             2              2       4
geri alinabilirlik                        1              1       2
yogun liste                               3              1       4
kullaniciyi onemseriz                     0              0       0
tutarli olmak                             0              0       0
erisilebilirlik pazarlik disi             1              0       1

bosta kalan ilke (hicbir karari belirlemedi): kullaniciyi onemseriz, tutarli olmak
dayanaksiz karar (hicbir ilkeye baglanmadi): ust menu sabit kalir, sayfalama yerine surekli akis
ic catisma tasiyan karar: suzgec paneli her zaman acik
ilkelere ragmen verilmis karar: kayit silme onay ister, bos durumda oneri listesi gosterilir

yer               kelime  yasak sozcuk             eylem  unlem  sonuc
arama bos sonuc       10  -                       var    -      gecti
odunc basarili         6  -                       YOK    -      eylemsiz
odunc hatasi           8  uzgunuz,maalesef,lutfen var    -      yasak
gecikme uyarisi        8  -                       var    -      gecti
alan dogrulama         3  gecersiz,yaptiniz       YOK    -      yasak+eylemsiz
silme onayi            9  -                       var    -      gecti
raf bos durumu        18  -                       var    -      uzun
ihlal tasiyan metin: 4 / 7

İki Denetim, Dört Bulgu

İlk tablo yedi aday ilkeden ikisini eliyor. “Kullanıcıyı önemseriz” ve “tutarlı olmak” tersleri savunulamadığı için ayırt edici değil. İkinci tablo aynı iki ilkeyi ikinci kez eliyor: hiçbir kararı desteklemiyor ve hiçbirine karşı çıkmıyorlar, toplam etkileri sıfır. İki bağımsız ölçütün aynı iki ilkeyi işaretlemesi rastlantı değildir; tersi savunulamayan bir cümle zaten hiçbir seçeneği eleyemez.

Boşta kalan ilke listeye alınmaz. Bir ilkeler belgesinde her satırın bir bedeli vardır: okunma zamanı, ezberlenme yükü ve yeni gelen birinin onu ciddiye alarak boşuna uygulamaya çalışması. Etkisiz bir ilke belgeyi seyreltir ve etkili olanların da ciddiyetini düşürür.

Dayanaksız karar ters yöndeki bulgudur: üst menünün sabit kalması ve sayfalama yerine sürekli akış kullanılması hiçbir ilkeye bağlanamıyor. Bu, kararların yanlış olduğu anlamına gelmez; dayanaklarının yazılı olmadığı anlamına gelir. İki olasılık vardır. Ya kararlar gerçekten dayanaksızdır ve ilk itirazda düşer, ya da ilkeler listesi eksiktir ve yazılmamış bir ilke bu kararları belirlemektedir. İkinci durumda eksik ilke bulunup yazılır; denetimin en verimli çıktısı budur.

Çatışma Bir Kusur Değildir

Üçüncü bulgu, süzgeç panelinin her zaman açık durmasıdır. Bu karar bir ilkeyi destekliyor (kayıt önce: süzgeçler kayda ulaşmayı hızlandırır) ve bir ilkeye karşı çıkıyor (yoğun liste: panel liste alanını daraltır).

Böyle bir çatışma sistemin kusuru değil, ilkelerin çalıştığının kanıtıdır. Çatışmayan ilkeler kümesi genellikle birbirinden bağımsız cümlelerdir ve gerçek ödünleşimleri adlandırmaz. Gerekli olan, çatışmayı kaldırmak değil öncelik sırasını yazmaktır: hangi ilke hangisine üstün gelir. Katalog kurumunda erişilebilirlik pazarlık dışıdır, sonra kayıt önce gelir, yoğunluk en sonda kalır. Bu sıra yazıldığında süzgeç paneli kararı tartışmasız hâle gelir.

Dördüncü bulgu ayrı bir kategoridir: kayıt silmenin onay istemesi ve boş durumda öneri listesi gösterilmesi kararları yalnızca ilkelere karşı duruyor. Bu, kararların gerekçesinin ilkeler dışında bir yerden geldiğini gösterir — silme onayı bir veri kaybı riskinden, öneri listesi bir kullanılabilirlik bulgusundan gelir. Bunlar meşru gerekçelerdir, ancak ilkeler belgesinde görünmedikleri için kayda geçirilmeleri gerekir. Aksi hâlde ilkeleri uygulayan biri bu kararları “sisteme aykırı” bulup kaldırır.

Ses Tonu Sözleşmeye Çevrilir

Son tablo tasarım dilinin ikinci parçasını ele alıyor. Ses tonu (tone of voice) çoğu belgede sıfatlarla anlatılır — açık, saygılı, yardımsever — ve bu sıfatlar hiçbir metni reddedemez. Sözleşmeye çevrilmesi, sıfatların denetlenebilir kurallara indirgenmesi demektir: en fazla kaç kelime, hangi sözcükler kullanılmaz, her ileti bir eylem önerir mi, ünlem kullanılır mı.

Yedi metinden dördü ihlal taşıyor. “Ödünç hatası” iletisi üç yasak sözcük içeriyor: özür ve rica kalıpları bilgi taşımaz, iletiyi uzatır ve hatanın kullanıcıdan kaynaklandığı izlenimini azaltmak yerine belirsizleştirir. “Alan doğrulama” iletisi hem yasaklı sözcük taşıyor hem de ne yapılacağını söylemiyor: üç kelimede iki ihlal. “Raf boş durumu” metni on sekiz kelimeyle sınırı aşıyor.

Dördüncü ihlal ise kuralın kendisini sorgulatıyor. “Ödünç alındı. Son teslim 12 Mart.” iletisi eylem önermediği için işaretleniyor, ama bu ileti bir onaydır; kullanıcıdan bir şey istemez. Kural burada yanlış pozitif üretiyor.

Bu, ses tonu denetiminin genel sınırıdır. Kurallar metnin türünü bilmez. Düzeltme, kuralı gevşetmek değil türe bağlamaktır: eylem önerisi zorunluluğu hata ve boş durum iletileri için geçerlidir, onay iletileri için değildir. Denetim kuralları, uygulandıkları metin türüyle birlikte tanımlanmadığında ya gereksiz uyarı üretir ya da gerçek ihlalleri kaçırır.

Dilin Belirteçlerde Karşılığı

Tasarım dilinin son parçası marka ifadesidir ve burada sistemin sayısal katmanına bağlanır. Bir ilkenin sistemde karşılığı olması, o ilkenin bir belirteç ailesini kısıtlaması demektir.

“Yoğun liste” ilkesi aralık ölçeğinin hangi adımlarının liste bağlamında kullanılacağını kısıtlar. “Sessiz arayüz” renk sisteminin doygunluk seçimini ve vurgu rollerinin sayısını kısıtlar. “Erişilebilirlik pazarlık dışı” kontrast eşiklerini bir tercih olmaktan çıkarır.

Bazı ilkelerin ise belirteç karşılığı yoktur: “geri alınabilirlik” bir sayı değil bir davranış kuralıdır ve önceki derste tanımlanan kural katmanında yaşar. Bu ayrımın yapılması gerekir, çünkü belirteç katmanına sığmayan bir ilkeyi belirteçle ifade etme çabası, anlamı taşımayan belirteçler üretir.

Marka ifadesi bu iki kanalın toplamıdır: sayısal katmanda kısıtlanmış değerler, kural katmanında yazılmış davranışlar. Kurumun sesi bunların ikisinden birden çıkar; tek başına bir renk ya da tek başına bir cümle kalıbı marka üretmez.

Özet

  • Bir tasarım ilkesi ancak tersi savunulabilir bir konumsa ilkedir; tersi savunulamayan cümle hiçbir seçeneği eleyemez ve ilke–karar matrisinde sıfır etki gösterir. Boşta kalan ilke belgeden çıkarılır; dayanaksız karar ya gerekçesizdir ya da yazılmamış bir ilkeye işaret eder, ve ikinci durum denetimin en verimli çıktısıdır.
  • İlke çatışması kusur değil, ilkelerin gerçek ödünleşimleri adlandırdığının kanıtıdır; çözüm çatışmayı kaldırmak değil öncelik sırasını yazmaktır.
  • Yalnızca ilkelere karşı duran kararlar başka bir gerekçeden gelir ve o gerekçe kayda geçirilmezse sonradan sisteme aykırı sayılıp kaldırılır.
  • Ses tonu, sıfatlardan denetlenebilir kurallara indirgendiğinde sözleşme olur: kelime sınırı, yasak sözcük listesi, eylem önerisi ve noktalama kuralı.
  • Denetim kuralları metin türüne bağlanmadığında yanlış pozitif üretir; onay iletisinden eylem önerisi beklemek buna örnektir.
  • Bir ilkenin sistemde karşılığı ya bir belirteç ailesini kısıtlamasıdır ya da kural katmanında yazılmasıdır; ikisine de sığmayan ilke uygulanamaz.

Sonraki Adım

Sistemin kuruluş kararları burada tamamlanıyor: kapsam çizildi, gerekçe hesaplandı, envanter çıkarıldı, ölçek stratejisi seçildi ve tasarım dili denetlenebilir hâle geldi. Bundan sonrası bu kararların makinede yaşayan karşılığıdır. Ölçek adımlarının, renk rollerinin ve düzen kararlarının adlandırılmış değerlere dönüşmesi gerekiyor; bu adların hangi katmanda durduğu, birbirine nasıl başvurduğu ve hangi başvuruların yasak olduğu ayrı bir mimari sorudur. Sonraki konu belirteçlerle başlar: ilk ders üç katmanı tanımlar, katmanlar arası başvuru kurallarını koyar ve belirteç grafiğini döngü, boşta kalan belirteç ve katman ihlali için çözümler.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat