Forum: Ders Arası RSS
Müzik Yapalım
Mert ağabey için...:)
Sayfa:  önceki  1  2  3  sonraki 
Avatar
mert #16
Üye Ara 2010 tarihinden beri · 194 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 7999
Tasarımın da belirleyici olduğu durumlar yok değil.
"File nesnesini işlev içinde kurmak ve bunu yapının üyesi olarak kullanmamak daha doğrudur."
Ben de aynen senin kodladığın biçimde kullanıyorum File nesnesini. Bunun bir nedeni tasarımın gerekleri. Belki ileride değiştiririm ama şu ara öyle kullanmamın daha etkin olduğunu düşündüyorum sanırım. Zararlarını gördükçe tasarımda bazı kararlar alınması kaçınılmaz olacak ki asıl öğretici olan kısım da burada bana kalırsa.
Zaten Senin bol neşeli programının bir kaç adım sonrasında switch içerisindeki ifadeler birer sınıfa dönecek gibi görünüyor.
O zaman bu duruma daha farklı bir açıdan yaklaşmak isteyebileceksin sanıyorum.
Tamamen tasarımınla ilgili bir durum. Ancak bazen hatalı olanı da göstermek gerekiyor ki yanlışların sayısı azalabilsin. Sanıyorum sen de şu an bu noktayı kurguluyorsun. İyi de yapıyorsun çünkü beklentimiz bu yönde. Başka türlü nasıl daha öğretici olabiliriz ki değil mi ama?

Bol detay, bol açıklama, çözüm önerileri doğrultusunda başlangıcından itibaren adım adım geliştirilen program örnekleri çok yararlı oluyorlar.
mert
Avatar
mert #17
Üye Ara 2010 tarihinden beri · 194 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yine belirtmeden edemeyeceğim bir konu var ki...
Bu önerdiğim öğretici kod örnekleri aslında tam da senin kalemin Salih. Soruna farklı açılardan yaklaşabilme yeteneğin, çözümü basite indirgemen, sorgulaman, kurgulaman bu tarz öğretici bölümlerin geliştirilmesinde senin katkılarını olmazsa olmaz yapıyor.

Tek fazlan var o da karmaşık düşünebilme yeteneğin. Örneklemeleri basit ve açıklayıcı sunduğunda sanırım o yetin daha fazla artı değer katacak öğren(ret)me çabamıza.

Herşeyi de Ali Hocamızdan beklememiz lazım. O zaten gerektiği durumlarda bir parantez açıp gerekli katkıyı şıppadanak ekliyor çalışmalarımıza.
mert
Avatar
Salih Dinçer #18
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 7995
mert:
Ha bu arada ben std.stdio; harici bir kütüphaneyi projemde kullanmaktan kaçınıyorum sürekli. Bunun bir nedeni de dil halen geliştiriliyor olduğundan emekliye ayrılan işlevlerle baş edemeyecek olduğumu düşünmem.
Bence herkes elinden geldiğince tüm sınıfları kullanmayı düşünmeli. Çünkü bir çözümün en güvenli kodu gerçekten de orada. Mesela uzun süre std.conv'yi kullanmamaya gayret ettim. Sonra çok akıllı şablonlara sahip olduğunu görünce kendi küçücük çözümlerimi bir kenara bıraktım. Bunu da forumda dile getirdiğimi hatırlıyorum...:)

Hepsinden önemlisi bu tutum size zaman kazandıracak. Hatta std.stdio'nun de sürekli değiştiğini ve o kullanmadığımız bir çok sınıfa bağlı olduğunu düşünürsek ne kadar haklı olduğumu tahmin edebilirsiniz. Zaten emekliye ayrılması planlanan bir şey önceden kurulmuş çok akıllıca sistem ile duyuruluyor. Dolayısıyla hız ve güvenlik sağlayacak bir olanağı kullanmak çok iyi olsa gerek.

File yapısı olayına gelince...

Bu yapıyı az önce biraz inceledim. Gördüğüm kadarıyla içinde başka bir yapı var; bir de bu yapının işaretçisinin ve isminin tutulduğu üyeleri. Meğer biz bütün işlemleri bu işaretçi ve dolayısıyla diğer yapı içindeki FILE nesnesi üzerinden yapıyormuşuz. Herhalde bu da çekirdekte olan bir şey ve buna kapsülleme mi ne diyorlar...:)

Bizim örneğimizde ise sanırım kapsülleme gibi bir şey yapıyoruz. Bu terimlerden çok anlamıyorum ama basit mantıkla (functional programming) olayı kurduktan sonra işleri biraz daha düzene sokmak için yapı içine sardık. Adeta bir bayram hediyesi gibi paketledik...:D
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
mert #19
Üye Ara 2010 tarihinden beri · 194 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
diğer modülleri kullanmamaya çalışmam geçici bir durum. biraz pratik yapma hesabından gidiliyor o duruma :-)

Herhalde bu da çekirdekte olan bir şey ve buna kapsülleme mi ne diyorlar...

O ne ola ki ? :-)))
mert
acehreli (Moderatör) #20
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Çok güzel bir konu oldu. :)

Araya karıştırmak istediğim bir kaç not var. Bunlara belki daha sonra değinecektiniz ve belki de değindiniz bile ama ben kaçırdım.

  • Bu noktayı Salih sonradan düzeltmiş ama ilk foreach döngüsünü int üzerinden kurup sonra cast ile tür değiştirmeye gerek yok diyecektim. Hatta, .max'ın özel olarak işlenmesinin gerekmesi ise bir talihsizlik. Yapacak bir şey de yok. enum'lar çok işe yarıyorlar ama böyle gariplikleri olmak zorunda.

  • Notalar yerine Nota daha iyi bir isim olabilir mi acaba? Nota.Do "do notası" anlamına geliyor. Öte yandan Notalar.Do da "notalardan do" oluyor. :) Ben yine de Nota derdim.

  • notayıKodla'ya da gerek yok: std.conv.to o işi de becerir: to!Notalar("Mi")

  • Kendim yazsam, aşağıdaki gibi bir durumda .open da kullanmazdım herhalde:
void dosyayaYaz(string dosya_ismi, string notalar) {
    File dosya(dosya_ismi ~ ".dat", "w");
    dosya.write(notalar);
}

  • Bu amaç için fazla karmaşık olabilir; aklıma geldi diye yazıyorum: Dosyayı satır satır okumak için .byLine var. Okunan her satırı da map'ten geçirebiliriz. Alışık olmayanlara karışık veya itici gelebiliyor ama bulunsun: :)
import std.stdio;
import std.algorithm;
import std.conv;
import std.array;
 
void main()
{
    auto dosya = File("deneme.txt", "r");
    int[] sayılar = dosya.byLine()              // satır satır oku
                         .map!(a => to!int(a))  // int'e dönüştür
                         .array;                // dizi oluştur
    writeln(sayılar);
}

  • toLower'ın yalnızca bazı alfabelerde doğru işleyebildiğini biliyoruz. Salih, senin gösterdiğin toLower ve toUpper ise yalnızca ASCII tablosunda geçerli.

  • File'ın yapının üyesi olup olmaması konusunda tahmin edilen görüşüm doğru. :) File, müzik kutusu kavramının bir parçası değildir. File, MüzikKutusu nesneleri oluşturulurken ve onun verileri yazılıp okunurken kullanılan bir araçtır. Şimdiye kadar anladığım kadarına bakarsak olsa olsa dosya ismi MüzikKutusu'nun üyesi olabilir... gibi geliyor... :) Eğer MüzikKutusu nesnelerinden çok sayıda olacaksa büyüklüklerinin bir de File kadar artmasını istemeyiz.

  • Deneyim konusunda çok haklısınız. Daha önce de konuştuk: Ne kadar yazılsa ve söylense de insanın kendi yaşayarak ve yanılarak öğrenmesi gibisi yok.

  • Evet, bunları Salih bir yazı dizisi gibi yazsın ama her zaman için kodları basit tarafından alsın. :)

  • Evet, File C'den beri bildiğimiz FILE* türünü sarmalar. (Encapsulation'ın karşılığı olarak "sarma" demiştik. Kitapta da öyle geçiyor; bence devam... ;))

  http://ddili.org/ders/d/sarma.html

Ali
Avatar
Salih Dinçer #21
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Hatta, .max'ın özel olarak işlenmesinin gerekmesi ise bir talihsizlik. Yapacak bir şey de yok. enum'lar çok işe yarıyorlar ama böyle gariplikleri olmak zorunda.

Bence bu .min ve .max'lar sadece bir makro! Derleme anında bunların yerine karşılıkları aynen konuyor; biz tek tek koymayalım diye. Hatta makrodan da öte, işaret ettiği değiştiğinde onlarda değişiyor...

acehreli:
Notalar yerine Nota daha iyi bir isim olabilir mi acaba? Nota.Do "do notası" anlamına geliyor. Öte yandan Notalar.Do da "notalardan do" oluyor. :) Ben yine de Nota derdim.

Bence bunun bir önemi yok çünkü doğrudan kullanmıyoruz. Ama dil bilgisi olarak daha anlamlı olduğu konusunda hemfikiriz.
 
acehreli:
notayıKodla'ya da gerek yok: std.conv.to o işi de becerir: to!Notalar("Mi")

Hocam bunu denemiştim ve tekrar belirttiğin için üzerine asıldım...:)

Asıldım çünkü, sıkıntılı hatalar alıyordum. Ben de ilk iletimde belirttiğim gibi "beceremedim" dedim. Sonra bir tane try catch kümesi koyduğumda programın çökmesini engelleyebileceğimi düşündüm. Şimdi kod daha kısa oldu...

acehreli:
Kendim yazsam, aşağıdaki gibi bir durumda .open da kullanmazdım herhalde:
void dosyayaYaz(string dosya_ismi, string notalar) {
    File dosya(dosya_ismi ~ ".dat", "w");
    dosya.write(notalar);
}

Hocam o şekilde tek satır çok leziz gözüküyor; ancak denediğimde hata verdi. Ama şu şekilde bir sıkıntı yok ve bundan sonra hep böyle kullanmayı düşünüyorum, teşekkürler...
auto veriler = File(this.dosya, "w");
acehreli:
Bu amaç için fazla karmaşık olabilir; aklıma geldi diye yazıyorum: Dosyayı satır satır okumak için .byLine var. * toLower'ın yalnızca bazı alfabelerde doğru işleyebildiğini biliyoruz. Salih, senin gösterdiğin toLower ve toUpper ise yalnızca ASCII tablosunda geçerli.

Bu örnek için teşekkür ederim. Sanırım uygulama geliştikçe kullanabiliriz. Örneğin her satır bir şarkı notası olur ve oku işlevi alacağı parametre ile (index) şarkı seçimi yapılabilir. Ancak şu tek ayraç (delimiter) boşluk olduğu için readln() yeterli gözüküyor.

acehreli:
File'ın yapının üyesi olup olmaması konusunda tahmin edilen görüşüm doğru. :) File, müzik kutusu kavramının bir parçası değildir. File, MüzikKutusu nesneleri oluşturulurken ve onun verileri yazılıp okunurken kullanılan bir araçtır. Şimdiye kadar anladığım kadarına bakarsak olsa olsa dosya ismi MüzikKutusu'nun üyesi olabilir... gibi geliyor... :) Eğer MüzikKutusu nesnelerinden çok sayıda olacaksa büyüklüklerinin bir de File kadar artmasını istemeyiz.

Holeyyy, doğru tahmin etmişim...:D

acehreli:
Deneyim konusunda çok haklısınız. Daha önce de konuştuk: Ne kadar yazılsa ve söylense de insanın kendi yaşayarak ve yanılarak öğrenmesi gibisi yok Evet, bunları Salih bir yazı dizisi gibi yazsın ama her zaman için kodları basit tarafından alsın.

An itibariyle ikilemdeyim! Basit seviyorum ama basit artık benim için çok sıkıcı olmaya başladı. Ama hala karmaşık şeylerden hoşlanmıyorum. Yani orta karar bir şeye ihtiyacım var. Ama her zaman satır sayısı az olan şeylerden hoşlandığımı yinelemeliyim.

acehreli:
Evet, File C'den beri bildiğimiz FILE* türünü sarmalar. (Encapsulation'ın karşılığı olarak "sarma" demiştik. Kitapta da öyle geçiyor; bence devam... ;))
Evet, ben de bunu demek istemiştim. Aslında OOP'da çok fazla terim yok gibi ama karıştırıyorum hep...

Bu arada Ali hocamın yukarıdaki katkılarıyla enum büyük harf oldu (çünkü do rezerve edilmiş bir anahtar sözcük olduğu için kullanamıyoruz) ve struct şu hale geldi:
  import std.array, std.stdio, std.conv, std.uni;
  
  enum Notalar { DO = 1, RE, MI, FA, SOL, LA, SI } 
 
  struct MüzikKutusu {
    int[] kodlar;
    string dosya;
            
    this(string dosya_ismi) {
      dosya = dosya_ismi ~ ".dat";
    }
        
    private auto kodla(string notalar) {
      int[] sonuç;
      
      foreach(nota; split(notalar)) {
        string NOTA;
        foreach(c; nota) NOTA ~= toUpper(c);
        
        try {
          sonuç ~= to!Notalar(NOTA);
        } catch {
          continue;
        }
      }
      return sonuç;
    }
 
    public void kaydet(string notalar) @property {
      auto veriler = File(this.dosya, "w");
      
      foreach(nota; kodla(notalar)) {
        veriler.write(nota);
      }
    }
 
    public void oku() @property {
      auto veriler = File(this.dosya, "r");
 
      foreach(sayı; veriler.readln()) {
        kodlar ~= to!int(sayı) - 48;
      }
    }
    
    public string toString() @property {
      auto sonuç = appender!string();
      
      foreach(nota; kodlar) {
        std.format.formattedWrite(sonuç,
             "%s\t", cast(Notalar)nota);
      }
      return sonuç.data;
    }
}
Bunu önceki main() ile sorunsuzca kullanabiliyorsunuz. Ancak her şey biraz daha kısa gözüksün ve az tuşa basalım diye vazgeçemediğim with()'li sürümü de paylaşayım. Maksat lahmacun yanında (yani MüzikKutusu için) ortaya yeşillik...:D

void main() {
  string müzik_notası;
  readf(" %s\n", &müzik_notası);
  
  with(MüzikKutusu("ses")) {
    kaydet(müzik_notası);
    oku();
    toString.writeln();
  }
}

Küçük bir özet geçersek bu örneğimizde şu olanakların hepsini kullandık:
  • readf() ile girişten veri aldık
  • with() sayesinde yapımız ile bütünleştik...:)
  • ~ işleçinin her iki anlamıyla da kullandık (üçüncüsü bool mantığında değil)
  • split() ile sözcükleri bir string[] dizgesine böldük
  • toUpper() ile sözcükleri büyük harfe çevirerek %100 uyumluluk sağladık (Türkçe karakterler hariç)
  • to!Notalar ve enum ile veriler arasında kolay eşleşme sağladık (eşleme tabloları sıralama sıkıntısı yapardı!)
  • try catch sayesinde hatalı nota girildiğinde yazılımın çökmesini engelledik ve
  • continue ile bunları süzdük; önemsemedik...
  • File yapısını doğrudan kurarak kullandık
  • Veriyi okurken 48 sihirli sabiti ile karşılaştık (irdelenmesi gereken bir konu!)
  • appender() ile üstün veri işleme olanağına adım attık (kapsamlı bir mevzu...)
  • formattedWrite() sayesinde enum'un dizge karşılığına sorunsuzca elde ettik!

Ne kadar çok şey elde etmişiz ve belki dikkatimden kaçanlar da vardır...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
mert #22
Üye Ara 2010 tarihinden beri · 194 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Salih
An itibariyle ikilemdeyim! Basit seviyorum ama basit artık benim için çok sıkıcı olmaya başladı. Ama hala karmaşık şeylerden hoşlanmıyorum. Yani orta karar bir şeye ihtiyacım var. Ama her zaman satır sayısı az olan şeylerden hoşlandığımı yinelemeliyim.


Bu bölümde yazdığımız kodları daha çok başkaları için tasarlayıp yazıyoruz ama kendimizi de geliştirmekten geri durmuyoruz. O nedenle basit yalın talebim bizim basit yalın anlayışımızdan çok, bu dil ile ilk defa karşılaşmış ve bu düzlemdeki yayınlardan faydalanarak yol almaya çalışan arkadaşlarımızın "aa, ne kolaymış" diyeceği türden bir yalınlık demeye çalışıyorum.

Bunu yapabilirsek artı değeri daha fazla çoğalır diye düşünüyorum yaptıklarımızın.

Salih
Bence bu .min ve .max'lar sadece bir makro! Derleme anında bunların yerine karşılıkları aynen konuyor; biz tek tek koymayalım diye. Hatta makrodan da öte, işaret ettiği değiştiğinde onlarda değişiyor...

Salih biraz daha açabilir misin?

acehreli:
Notalar yerine Nota daha iyi bir isim olabilir mi acaba? Nota.Do "do notası" anlamına geliyor. Öte yandan Notalar.Do da "notalardan do" oluyor. :) Ben yine de Nota derdim.
Nota çok daha anlamlı görünüyor.

Salih:
(çünkü do rezerve edilmiş bir anahtar sözcük olduğu için kullanamıyoruz)
Fena halde atlamışız burayı. Tühh!

Nihayetinde ortaya çıkan program leziz açıklamalar şahane. Daha?...
mert
acehreli (Moderatör) #23
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Dosyanın sonunda örneğin bir '\n' olsa kodlar şu hale gelebiliyor:

kodlar: [1, 2, 3, 4, -38]

Ve onu yazdırınca:

DO    RE    MI    FA    cast(Notalar)-38   

Ayrıca bir hata çeşidinin try-catch ile gözardı edilmesi bana hiç güvenli gelmiyor. Hatalı olduğumuzu hemen anlamak isteriz. Hata try-catch ile yutulursa, bunun sakıncası program işleyişi devam ettikten çok sonra farkedilebilir ve anlaşılması zorlaşır.

Ali
Avatar
Salih Dinçer #24
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #22
mert:
Salih Dinçer:
Bence bu .min ve .max'lar sadece bir makro! Derleme anında bunların yerine karşılıkları aynen konuyor; biz tek tek koymayalım diye. Hatta makrodan da öte, işaret ettiği değiştiğinde onlarda değişiyor...
Salih biraz daha açabilir misin?
Bir örnek ile açıklayayım:
void main() {
  Notalar nota;
  ushort topla;
  
  foreach(/* oto tür */i; nota.min..nota.max)/* ~
  foreach(ushort i; 0..7)/* yukarıdakine benzer */ 
  {
       topla += i;
       i.write("\t");
  }
  assert(topla == 21);
}
Yukarıdaki kodda iki nokta önemli olduğunu düşünüyorum; açıklayayım:

  • Öncelikle /* oto tür */ diye işaret ettiğim yerde kendimizin de elle müdahale edebileceğimiz özellik çok çok önemli! Hiç bir şey yazmazsak türü ikinci parametreden (sağdan) çıkarsar. O yüzden Notalar türü küme içine kadar sızar. Bunu ilk foreach() başına açıklama karakterini (//) koyarak anlayabiliriz.
    • Ayrıca belirtmeliyim döngü içindeki iki satıra da farklı türler gidiyor. Yani enum'un sayısal karşılığı toplanırken, sonucun yazıldığı ushort'a dönüştürülüyor. Dedik ya sağdan çıkarsıyor ki ikinci satırda da enum'un bir eksiğinin yani nota.max - 1 farkının listesini alırız: Do    Re    Mi    Fa    Sol    La   
  • Dikkat edilmesi gereken diğer nokta da /* yukarıdakine benzer */ açıklaması; dikkat, "benzer" dedim çünkü sağdan çıkarsama olduğu için tam karşılığı aslında şu: foreach(i; nota.Do..nota.Si)

Makro demenin sebebi ise .min ve .max özelliklerinin döndürdüğü değer, bağlı olduğu veya gösterdiği değerin baş ve son elemanlarının yukarıdaki gibi yerine konması. Eğer bunları aynı şekilde elle yazsaydık ve geliştirme esnasında yeni elemanlar ekleyip çıkarsaydık derleme hatası da alabilirdik, çalışma zamanı gariplikleri de yaşardık. Çünkü kod bütünlüğü bozulmuş oluyor, tıpkı sihirli sabitler gibi.

mert:
Nihayetinde ortaya çıkan program leziz açıklamalar şahane. Daha?...
Dahası diğer arkadaşlarda çünkü bizler sıramızı saldık gibi? Sanırım üçümüz de katkı sağladık. Başta Erdem olmak üzere diğer arkadaşların da önerilerini merakla bekleyeceğim...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
mert #25
Üye Ara 2010 tarihinden beri · 194 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Salih:
Yukarıdaki kodda iki nokta önemli olduğunu düşünüyorum; açıklayayım:

    Öncelikle /* oto tür */ diye işaret ettiğim yerde kendimizin de elle müdahale edebileceğimiz özellik çok çok önemli! Hiç bir şey yazmazsak türü ikinci parametreden (sağdan) çıkarsar. O yüzden Notalar türü küme içine kadar sızar. Bunu ilk foreach() başına açıklama karakterini (//) koyarak anlayabiliriz.

        Ayrıca belirtmeliyim döngü içindeki iki satıra da farklı türler gidiyor. Yani enum'un sayısal karşılığı toplanırken, sonucun yazıldığı ushort'a dönüştürülüyor. Dedik ya sağdan çıkarsıyor ki ikinci satırda da enum'un bir eksiğinin yani nota.max - 1 farkının listesini alırız: Do    Re    Mi    Fa    Sol    La   

    Dikkat edilmesi gereken diğer nokta da /* yukarıdakine benzer */ açıklaması; dikkat, "benzer" dedim çünkü sağdan çıkarsama olduğu için tam karşılığı aslında şu: foreach(i; nota.Do..nota.Si)

Çok teşekkür ederim Salih, bilgi bankası gibi oldu.

Salih:
Dahası diğer arkadaşlarda çünkü bizler sıramızı saldık gibi? Sanırım üçümüz de katkı sağladık. Başta Erdem olmak üzere diğer arkadaşların da önerilerini merakla bekleyeceğim...:)

Yok. En azından ben daha sıramı savamadım ve savmayı da düşünmüyorum açıkçası. Bir planlama yaptım gün içinde Müzikli kodumuzla uğraşırken. Aşama aşama onu geliştirmeyi düşünüyorum.
Katkılarınızı rica edeceğim ama hemen değil. Kavramı şöyle bir oturttuktan sonra  değerli bilgilerinizden yararlanmayı talep edeceğim.
Hele bir kolaylayalım bakalım :-)
mert
Bu mesaj mert tarafından değiştirildi; zaman: 2012-10-17, 14:55.
Avatar
Salih Dinçer #26
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #23
acehreli:
Dosyanın sonunda örneğin bir '\n' olsa kodlar şu hale gelebiliyor:

kodlar: [1, 2, 3, 4, -38]

Ve onu yazdırınca:

DO    RE    MI    FA    cast(Notalar)-38   
Bu satır başı karakteri klavyeden koda giriyor mu; yoksa bir metin editörü ile mi ekledik?

acehreli:
Ayrıca bir hata çeşidinin try-catch ile gözardı edilmesi bana hiç güvenli gelmiyor. Hatalı olduğumuzu hemen anlamak isteriz. Hata try-catch ile yutulursa, bunun sakıncası program işleyişi devam ettikten çok sonra farkedilebilir ve anlaşılması zorlaşır.
Peki bunun dışında bir çözüm aklımıza geliyor mu? Yoksa switch() geri dönmemiz gerekecek. Çünkü switch() ile gelen bir default: özelliği olduğu için işimizi çok kolaylaştırıyordu.

Farkında mısınız; try catch ile aslında süzme (filter) işlemi yapıyoruz. Yani enum ile eşleşmeyen değerler olduğunda hata atılıyor ve biz onları sonuç'a döndürmüyoruz. Çünkü döngüye devam etmesi gerektiğini ve diğer kayda geçiyoruz.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
mert #27
Üye Ara 2010 tarihinden beri · 194 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Salih:
Bu satır başı karakteri klavyeden koda giriyor mu; yoksa bir metin editörü ile mi ekledik?
Konsol üzerinden veri okumada sorun göremedim ben. Sanırım Kod içerisinde
 public void kaydet(string notalar) @property {
      auto veriler = File(this.dosya, "w");
      
      foreach(nota; kodla(notalar)) {
        veriler.write(nota, '\n');   //  bu biçimde bir düzenleme
      }
    }
Bir düzenlemeden bahsediyor Ali hocam
mert
acehreli (Moderatör) #28
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #26
Salih Dinçer:
Bu satır başı karakteri klavyeden koda giriyor mu; yoksa bir metin editörü ile mi ekledik?

Metin düzenleyiciyle ekledim. Bu türün kullanımının dışında bir harekette bulunduğumu sanmıyorum çünkü arayüzü ile şu kullanımın normal olduğunu düşündürüyor:

    auto m = MüzikKutusu("ses");
    m.oku();
    writeln(m);

Eğer kendisi yazmadan okunamıyorsa bu kullanımda da hata vermesi sağlanabilir.

Farkında mısınız; try catch ile aslında süzme (filter) işlemi yapıyoruz.

Kabul. Ama eğer bu hata kullanıcıdan kaynaklanmışsa süzersek ona haksızlık etmiş oluyoruz. Eğer bu hata kendi kodumuzdan kaynaklanmayacaksa o zaman bir assert() ile denetlemek daha iyi olabilir.

Ali
Avatar
Salih Dinçer #29
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Eğer kendisi yazmadan okunamıyorsa bu kullanımda da hata vermesi sağlanabilir.
Bu yapıyı tıpkı yukarıdaki gibi kullanmak gerekecek. Çünkü daha önce kayıt edilen şarkı veri tabanından çekilip ses üretecine gönderilecek. Yoksa ilk örneğimiz klavyeden girilen değerin doğrudan ekrana yansıtılması (3 satır) gibi olacak ki dosyaya kayıt ve okuma süreçini anlamsız kılıyor.

Peki olayı biraz renklendirmek için notaları PC speaker'ına gönderebilir miyiz? Bu konuda assembly kodu araştıracağım...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
mert #30
Üye Ara 2010 tarihinden beri · 194 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Salih:
ünkü daha önce kayıt edilen şarkı veri tabanından çekilip ses üretecine gönderilecek.
Salih hocam. Kodun bu aşamasını daha önceden mi tasarlamıştınız kendiliğinden doğaçlama mı gelişti diye sorsam?
mert
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2  3  sonraki 
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 03:55:45 (UTC -08:00)