| |
 | Posted by Ali Çehreli (acehreli) in reply to erdem | Permalink Reply |
|
Ali Çehreli (acehreli) 
| Doğru işlediğini biraz da birim testlerinden duymak isteriz. ;)
Bir kaç not ekledim:
/*
* [Ali] Global değişkenler eninde sonunda sorun doğururlar. Taze örnek (C++
* ama farketmez): bizim firmada iki farklı grup daha geçen hafta global
* değişkenlerin ilklenme ve sonlanma sıralarının tanımlanmamış olmasının
* neden olduğu hatalarla uğraştılar.
*/
/*
* [Ali] Bu herhalde eskinden kalmış olmalı. Değeri programda hiç
* değişmiyor. Ne olursa olsun, kullanıldığı yere yakın tanımlanmalı. Örneğin
* belki de yalnızca ayrıştır() tarafından kullanılıyordur.
*/
static int sayac = 0;
/*
* [Ali] Bu daha büyük bir sorun. En azından ileride gerekse, programda
* belirli bir anda ancak tek metin ayrıştırılabilir. ayrıştır()'ı çağıranlar
* bunun global olduğunu bilmek zorundadırlar ve hemen kopyalamaları gerekir.
*
* ayrıştır() gibi işlevlerin kendi işleri için kullandıkları global veya
* static değişkenler onları 'non-reentrant' (iki kere çağrılamayan)
* yapar. ayrıştır() için öyle bir sorun düşünemiyorum ama globallerden
* kaçınmak gerektiği için sözü uzatıyorum. :)
*
* Çözüm: metin, ayrıştır() tarafından döndürülmelidir:
*
* Metin ayrıştır(string yazı) { ... }
*/
auto metin = Metin();
// [Ali] ...
foreach (dchar harf; eklenen) {
/*
* [Ali] Buradan "koyu" yazının her zaman için iki harfle
* gösterildiğini anlıyoruz. Ama eğer çıkış biriminin ne
* olduğunu biliyorsak zaten Metin diye bir türe gerek
* bile yoktur. Girişi baştan sonra okuyarak bir string
* üretebiliriz.
*
* Oysa Metin türü yalnızca metni tarif etse, ondan sonra
* ona "kendini konsola gönder", "kendini dosyaya gönder",
* vs. diyebiliriz.
*
* Yani Metin'in gücü, metin düzenini tarif etmesinde
* duruyor.
*/
yazı ~= harf;
yazı ~= harf;
// [Ali] ...
string toString() const
{
/* [Ali] Bu da zamanla basitleşmiş olmalı; yoksa bu haliyle doğrudan
* yazı da döndürülebilir. */
return format("%s", yazı);
}
}
void ayrıştır (string yazı)
{
/*
* [Ali] İstediğin bu olmayabilir ama aklımda taze olduğu için
* hatırlatıyorum.
*
* Aralıklar dersinde çok yeni yazdığım gibi, eğer std.array * eklenirse
* ve yazı bir InputRange olarak kullanılırsa, UTF kod birimleri değil,
* harfler görünür. Gerekenler:
*
* 1) import std.array;
*
* 2) InputRange olarak kullanmak; yani
*
* 2a) ya for yerine foreach,
*
* 2b) ya da for döngüsünde yazı.empty, yazı.front, ve yazı.popFront()
* diye InputRange işlevleri kullanmak
*
* (Dikkat: o işlem sırasında yazı tükenebilir. :D Onun için bir dilim
* tüketmemiz gerekebilir.)
*/
// dizi içeriğini karakter karakter yaz
for (int i = 0; i != yazı.length; ++i) {
writeln(i, " ", yazı[i], " ");
}
/* [Ali] Önemsiz ayrıntı: length'in türü işaretsiz olduğu için sıfırdan
* küçük olamaz. */
if (yazı.length <= 0) çıkış("dizinin işlenmesi tamamlandı");
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
|