Alıntı (acehreli):
>- Nitelik işlevleri sanki türlerin bir üyesine erişiyormuş gibi düşünülürler. Sanki nesnenin 'uzunluk', 'renk', 'ağırlık', vs. gibi bir niteliğine eriştirirler. O yüzden bu işlevlerin isimleri 'isim halinde' seçilir. Ve o yüzden bence VerFirinSicakligi yerine kısaca 'sicaklik' olmalı.
Nitelikler hakkında aynen senin gibi düşünüyorum ama sanırım C#'dilinden gelen bir alışkanlık get-set metodlarını kullanmak bence daha güzel bir kodlama oluşturuyor. Tabi ben get-set yerine ver-yap ikilisini tercih ediyorum :) Bu sebeple bir üye değişkeni değiştiren @property metotlarını isimlendirirken eğer üyeyi değiştiriyorsa yap (set), yok eğer üyenin değerini kullanıcıya sunuyorsa ver (get) ön ekini eklemek bana iyi bir yöntemmiş gibi geliyor.
Alıntı:
>- Benzer şekilde, IsBitisSuresi'nin de isminde eylem görülmediği için sanki bir nitelikmiş gibi algılanabiliyor. Aslında "10 saniye bekle" gibi bir açıklamaya gerek duyulmuş olması da o konuda bir gariplik olduğunu gösteriyor.
O açıklamayı yazarken senin bu yorumu yapacağın aklıma geldi yinede yazdım :) Yazdım çünkü daha öncesinde hakkında bir konuşma yapmadığımız bir kodu insanların önüne koyarken en azından nasıl düşündüğümü anlamaları için bir takım sınırlamalar getirerek kodların daha anlaşır olmasını istedim. Yoksa "10 saniye bekle" açıklaması tamamen gereksiz neticede zaten metotun parametresi 10 değerini net bir şekilde açıklıyor.
Diğer taraftan IsBitisSuresi metotdunun nitelikmiş gibi algılanması bir sıkıntı ancak ben o metodu private ile işaretleyerek zaten koruma altına aldım. Dolayısıyla nitelik veya başka şekilde düşünen düşünsün sorun değil ona sınıfı düzenleyen kişiden başka kimse erişemez. Ancak isimlendirme açısından haklısın, daha iyi bir isim verilebilirdi. Sanırım IsBitisSuresiKadarBekle() daha iyi olur, sen ne dersin Ali?
Alıntı:
>Parametrenin ismini 'saniye' seçerek sürenin biriminin saniye olduğunu belirtiyoruz ama bu bile kırılgan oluyor çünkü ilerideki bir zamanda birim milisaniye'ye dönüşse parametrenin ismi saniye olarak unutulmuş olabilir.
Buradaki saniye çalışma süresini simüle etmek için kullanılıyor. Dolayısıyla sınıf dışından bir müdahale yok, tamamen sınıfın kendi işleyi ile ilgili bir durum, bu sebeple ben int saniye isimlendirmesini bu yapı için çok anormal görmüyorum. Malum her olayı içinde bulunduğu ortamda değerlendirmek gerekir.
Ancak seninde belirttiğin gibi hem daha güzel bir programlama örneği olması açısından hemde daha esnek ve genişletilebilir bir yapı sağladığı için Duration kullanımıda gayet güzel olur.
Firin sınıfın son durumunu paylaşmak istiyorum, eleştiri ve önerileri bekliyorum;
/**
* Firin.d
*
* Firin sinifi tarihçesi
* + VerGazMiktari() metodu eklendi.
* + YazGazMiktari() metodu eklendi.
* * Fırının yakılması sırasında harcanmayan gaz miktarı hatası düzeltildi.
* * IsBitisSuresi() -> IsBitisSuresiKadarBekle() olarak değiştirildi.
* * IsBitisSuresiKadarBekle() metot parametre tipi ve adı değiştirldi.
*
* Derleyici : Digital Mars D (v2.058)
* Son Düzenleme : 11/04/2012
*/
import std.stdio;
import std.concurrency;
import std.exception;
import core.thread;
enum Hamuru
{
ince = 1, // En çok sevdiğim :)
orta,
kalın
}
void main()
{
writefln("Firin pisirme icin calistiriliyor ...");
Firin pizaFirini = new Firin(5000, 200);
pizaFirini.FiriniYakSicakligiAyarla();
writeln("Firin pisirmeye hazir.\n");
writefln("Firin sicakligi : %s derece", pizaFirini.VerFirinSicakligi);
writefln("Gaz miktari : %s birim", pizaFirini.VerGazMiktari);
}
class Firin
{
private int _firinSicakligi = 0; // 0..300 birim sıcaklık arasında çalışır.
private int _mevcutGazMiktari = 0; // 0..10_000 birim gaz depolanabilir.
public this(int yuklenecekGazMiktari, int yeniSicaklikDegeri)
{
this.YapGazMiktari(yuklenecekGazMiktari);
this.YapFirinSicakligi(yeniSicaklikDegeri);
}
private void FiriniYakSicakligiAyarla()
{
// Her 1 birim sıcaklık için 5 birim gaz yakar.
int harcananGazMiktari = _firinSicakligi * 5;
assert(harcananGazMiktari < _mevcutGazMiktari, "Firindaki gaz miktari yetersiz.");
_mevcutGazMiktari = _mevcutGazMiktari - harcananGazMiktari;
// Fırının ısınması 10 saniye sürer.
Duration firinIsinmaSuresi = dur!("seconds")(10);
IsBitisSuresiKadarBekle(firinIsinmaSuresi);
}
public void PizayiFirinaVer(Hamuru pizaHamuru)
{
assert(_firinSicakligi == 0, "Firin sicakligi yetersiz.");
if (_firinSicakligi > 0)
{
final switch (pizaHamuru)
{
case Hamuru.ince :
_mevcutGazMiktari -= 2; // Pişirme için harcanan gaz
break;
case Hamuru.orta :
_mevcutGazMiktari -= 3;
break;
case Hamuru.kalın :
_mevcutGazMiktari -= 4;
break;
}
//Piza pişiyor..
Duration pizaPisirmeSuresi = dur!("seconds")(10);
IsBitisSuresiKadarBekle(pizaPisirmeSuresi);
}
}
private void IsBitisSuresiKadarBekle(Duration sure)
{
Thread.sleep(sure);
}
@property int VerFirinSicakligi() const
{
return _firinSicakligi;
}
@property void YapFirinSicakligi(int yeniSicaklikDegeri)
{
enforce((yeniSicaklikDegeri >= 0) && (yeniSicaklikDegeri < 300), "Geçersiz fırın sıcaklığı [0..300]");
_firinSicakligi = yeniSicaklikDegeri;
}
@property int VerGazMiktari() const
{
return _mevcutGazMiktari;
}
@property void YapGazMiktari(int yuklenecekGazMiktari)
{
assert((yuklenecekGazMiktari >= 0) && (yuklenecekGazMiktari < 10_000), "Geçersiz gaz miktarı [0..10_000]");
_mevcutGazMiktari = yuklenecekGazMiktari;
}
}
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]