On Saturday, 30 November 2024 at 19:53:22 UTC, Ali Çehreli wrote:
> Zor...
...
Veya executeIf mi denir?
Hocam, bence biz programcılar tıpkı savaşçılar gibiyiz; parçalara bölmeyi çok seviyoruz, tek farkla: Biz parçala & yoket yerine parçalayarak çözüm üreti tercih ediyoruz. Belki de bir nakışcı/hattat edasıyla sevdiğim şeyi yapıyorum:
Sorunu, tek tek parçalara bölerek işle ve ortaya bir sanat çıkar/çözüm üret. Şurada değindiğim, aşağıda özetlediğim bunlardan biri...
1. adım için hasKey()
ve elemanı döndürür ve sanki bir helper gibi çalışır,
2. adım için changeBy()
ile tıpkı bir HOF gibi davranıp değer döndürmeden değişiklip yapılıp yapılmayacağını, gereksiz olup olmadığını kontrol eder ama kullanıcıdan bunun onayını da alabilir:
void main()
{
with (Yetki)
{
auto user = [
"Ali" : Admin,
"Ayşe" : Editör,
"Mehmet" : Ziyaretçi
];
try
{
user.hasKey("Ayşem")
.changeBy(Editör, (Yetki y)
=> y.format!"Yeni Yetki: %s"
);
}
catch (HataAA!Yetki e) {
e.msg.write;
}
catch (HataAA!string e) {
e.msg.write;
e.key.writefln!" çünkü kullanıcı (%s) bulunamadı!";
}
}
}
alias hasKey = step1;
alias changeBy = step2;
import std;
enum Yetki {
Ziyaretçi, Editör, Admin
}
class HataAA(K) : Throwable {
K key;
this(string msg, K key) {
super(msg);
this.key = key;
}
}
// STEP1: return pointer
auto step1(A, K)(A array, K key)
{
if (auto result = key in array)
{
return result;
} else throw new HataAA!K("Hata: 404", key);
}
// STEP2: no return
void step2(E, V, F)(E element, V value, F func)
{
auto öncekiYetki = *element;
if (öncekiYetki != value)
{
writeln("Yetkiyi değiştirmek ister misiniz? (E/H)");
string cevap = "h";//readln().strip();
if (cevap.toUpper == "E")
{
öncekiYetki.writeln(" yetkisi değiştirilecek...");
*element = value;
func(*element).writeln;
} else throw new HataAA!V("505: Yetki değişikliği yapılmadı, ", value);
} else throw new HataAA!V("606: Yetki zaten eşleşiyor.", value);
}
Bu kod bir taşla birkaç kuş vuruyor. Önce bilerek tek harf farkla "Ayşem" yazarak 404 hatasını yakalarıyorum. Sonra m harfini silin 505'i yakaladığını görün ve sonra cevap olarak h yerine E veya e yazın. Böylece sırasıyla uydurulmuş 505 ve 606 hatalarını yakaladığını ama programın göçmediğini göreceksiniz.
Tabi baştan beri konuştuğumuz ve İngilizce'ye çevirmeninin zor olduğu işlevi ikiye bölmek akıllıca olsa da callback fonksiyonunu (CBF) inline olarak satıriçi yapmak biraz uyduruk oldu. Çünkü gerçek bir high-order fonksiyonu (HOF) için acaba klavyeden soru sorma yeteneğini CBF mi yapmalıydım?
Özetle parçalara bölebilmek güzel ama seçtiğim işlev isimleri (hasKey & changeBy) yeterince anlamlı oldu mu?
SDB@79