Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

C++ Sınıf düzeni

Başlatan Klein, 17 Kasım 2012, 01:05:52

Klein

Bir kaç tane sınıf yazacağım.  Bunlarla ilgili bazı sorularım var. Sorular nasıl yapılırdan çok , nasıl yapmak geleneklere, genel kabul görmüş uygulamalara daha uygun olur şeklinde.

Gömülü sistemlerde, donanımlar pinlere bağlı.  STM32 serisinde de bir donanıma ait pinler bir kaç farklı porta remapping ile bağlanabiliyor.

Diyelim ki bir USART sınıfı yazacağız. Usart3 hem portB, hem portC de olabiliyor. Bunu da kullanıcının seçebilmesi gerek.

Soru:  Kullanıcı USART sınıfından bir nesne oluşturduğunda :

Portların init işlemlerinin kullanıcı tarafından daha önceden yapmış olması mı doğrudur?

Nesne create edilirken yapılandırıcıda mı init etmek daha doğrudur?

Yapılandırma esnasında yapılmayıp, kullanıcını tarafından  portları init eden metodun çağırılması şeklinde yapmak mı daha doğru yaklaşımdır. 

Eğer nesnenin yapılandırılma aşamasında yapmak doğru ise:
Kullanıcıyı  portlara ilişkin parametre girmeye zorlamak mı?
Parametre girmeden yapılandırmaya izin verip, yapılandırmada default seçilecek portları init etmek mi kabul görmüş yaklaşımdır.

 

Klein

Bir sorum daha var.

Üç farklı yöntem görüyorum genelde.

Class.h dosyasında sınıfın tanımı yapılıyor, fonksiyon prototipleri tanımlanıyor.
class.c dosyasında da fonksiyonlar yazılıyor.

başka bir yöntem
class.c dosyasında hem sınıfın tanımı yapılıyor hem de  fonksiyonlar doğrudan sınıf bloğunun içerisine yazılıyor. class.h dosyası ile export ediliyor.

class sınıf{
private
   a,b,c...
public
   set(x){
   ..
   ..
   }
.
.
.

}


diğer bir şekil ise, yine class.c dosyasında sınıf tanımlanıyor ama  bloğun içinde fonksiyon prototipleri tanımlanıp, fonksiyonlar bloğun dışında oluyor.

hangisi genel kabul görmüş tarzdır?
yazım kolylığı veya büyük programlarda takip kolaylığı açıından hangisi önerilir?

cicjoe

Hocam, ben constructor'da kullanicak portun zorunlu kilinmasi taraftariyim. Kullanan kisi sadece C portunu gorup, B'yi gozden kacirirsa, siz de default olarak B'ye atarsaniz, sorunlar cikacaktir. Sonradan degistirmeye izin vermek uygun olabilir. Baudrate gibi ayarlar ise zorunlu olmadan default degerler verilirse iyi olur bence. Tabi sonradan degistirebilecek sekilde.
Sinif tanimlamalari icin, tanim dosyasi + kod dosyasi seklinde yapilmasi taraftariyim. eger hepsi .cpp dosyasinda yapilirsa birden fazla yerde include edildiginde problem cikacaktir. header dosyalarina ya .h ya da hic bir uzanti verilmemesi yonunde fikrim.

Klein

Tamamdır hocam teşekkür ederim.
Tanım *.hpp  metodlar *.cpp içinde olunca takibini daha kolay yapabildiğim için, o şekilde başlamıştım. Böyle devam demekki.
Inline metodları hatırlattığınız iyi oldu. 

Anlatmak istediğiniz böyle bi şey miydi?  Yanlış mı anlamışım?

    class CommPort 
    {
      public:
          int open ( void );
          int close ( void );
          int SetBaudRate();
          int SetDataBits();
          int SetStopBits();
          int SetHandShake();
          int SetParity();
          ..
          ..
          CommPort (USART_Typedef *Usart );
          CommPort (USART_Typedef *Usart , GPIO_TypeDef *RxPort, GPIO_TypeDef *TxPort);
      protected:
           ..
           ..
           ~CommPort ( void );
      private:
    };
}


@cicjoe  benim de kafamda default portla yapılandırdıktan sonra, kullanıcının tekrar yapılandırması arasında geçecek sürede portlara olacaklar konusunda bazı endişelerim var.
Özellikle, default port daha önce oluşturulan bir nesne tarafından yapılandırılmışsa, onun ayarlarını bozmak gibi bir risk var. 

Kafamdan geçen,  yukardaki gibi iki farklı yapılandırıcı yazmak. Eğer kullanıcı portlarla ilgili parametreyi girmemişse , ne yaptığını bildiğini varsayıp default portları yapılandırmak.

Klein

Teşekkür ederim hocam. bu sorunu kafadan sildik.  Ama bende soru çok. 

Delphi gibi visual dillerdeki gibi "property"  tanımlayıp
Örneğin
BaudRate = 9600 dediğimde SetBaudRate(..) fonksiyonunun çağırılmasını yapabilir miyim? Bu derleyicilerin ilave özelliği mi? c++  için böyle bir özellik var mı?

Tagli

#5
C++'ı pek iyi bilmiyorum (öğrenme aşamasındayım) ama bildiğim kadarıyla böyle bir özellik yok.

Ancak, "operator overloading" ile benzer bir sonuç elde edilebilir belki. CommPort cp; gibi bir nesne üzerinde cp = 9600 denilerek baud rate ayarlaması yapılabilir ama pek hoş bir kullanım olmaz bence. = operatörü genellikle nesne kopyalama işleri için saklanır.

Şahsen ben nesne tabanlı programlamayı Java ile öğrenmeye başladığım için, set get metodları yazmaya elim alıştı ve uğraştığım kısa bir süre içinde de C#'ın sunduğu o erişim şeklini pek kullanmadım. Metodları açık bir şekilde yazarak çağırmak bana daha mantıklı geliyor, ama tercih meselesi tabi.
Gökçe Tağlıoğlu

cicjoe

Yazdiginiz kod gibi demek istemistim ben de aslinda =) Nesne olustururken port zorunlu olmasi yonunde fikrim.
Sonradan degistirmeye izin vermeyi de ekleyebilirsiniz dememin sebebi de su idi. B ve C portlarina 2 farkli cihaz bagli ise, 1 fonksiyon icinde tek nesne olusturulup, once B'ye sonra C'ye ayni ayarlarda data gondermek istenirse kolayca 1 kez ayar yapilip, ilk data gonderildikten sonra 2. porta gecilerek ayni ayarlarda diger porta gecilebilir gibi...

mufitsozen

sayin @klein C++ ile ilgili standard uygulamalar icin Herb Sutter, Andrei Alexandrescu meshur kitabi "C++ Coding Standards: 101 Rules, Guidelines, and Best Practices"

en guncel referanstir.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Klein

#8
Teşekkür ederim hocam. Kitapçılarda bulamazsam, internette bulurum herhalde.
 
Öyle bi konu oluyor ki, bazen Türkçe okuduğumda  bile kavramakta zorlanıyorum.
Bir yandan burada Türkçe anlatımlarla kavramları yerli yerine oturtup, diğer yandan da yabancı yayınlarla biraz daha pekiştiririm sanırım.


mesaj birleştirme:: 17 Kasım 2012, 17:07:21

Alıntı yapılan: cicjoe - 17 Kasım 2012, 16:02:30
Yazdiginiz kod gibi demek istemistim ben de aslinda =) Nesne olustururken port zorunlu olmasi yonunde fikrim.
Sonradan degistirmeye izin vermeyi de ekleyebilirsiniz dememin sebebi de su idi. B ve C portlarina 2 farkli cihaz bagli ise, 1 fonksiyon icinde tek nesne olusturulup, once B'ye sonra C'ye ayni ayarlarda data gondermek istenirse kolayca 1 kez ayar yapilip, ilk data gonderildikten sonra 2. porta gecilerek ayni ayarlarda diger porta gecilebilir gibi...

Biraz daha geliştikten sonra olabilir. Şu an, donanımda fiziksel hatalara neden olabilecek işleri (port remapping, init vs..) dinamik nesnelerle  yönetemem. başıma iş alırım.  nesne modelinin çalışmasını biraz daha kavradıktan ve hata yapma riskim azaldıktan sonra, daha dinamik nesnelere doğru yol alabilirim.


diot


mufitsozen

#11
Alıntı YapBiraz daha geliştikten sonra olabilir. Şu an, donanımda fiziksel hatalara neden olabilecek işleri (port remapping, init vs..) dinamik nesnelerle  yönetemem. başıma iş alırım.  nesne modelinin çalışmasını biraz daha kavradıktan ve hata yapma riskim azaldıktan sonra, daha dinamik nesnelere doğru yol alabilirim.]Biraz daha geliştikten sonra olabilir. Şu an, donanımda fiziksel hatalara neden olabilecek işleri (port remapping, init vs..) dinamik nesnelerle  yönetemem. başıma iş alırım.  nesne modelinin çalışmasını biraz daha kavradıktan ve hata yapma riskim azaldıktan sonra, daha dinamik nesnelere doğru yol alabilirim.

Sayin @klein, benim mesajlarinizdan anladigim siz C++'i embedded sistemlerde kullanmak istiyorsunuz.

isin basinda oldugunuza gore bunu kotu aliskanliklar vb ogrenmeden endustri standardlarina uygun olarak baslamaniz bence daha kolay olur.

Bunun icin size MISRA'nin "c++ guidelines for the use of the c++ language in critical systems" ve CERT'den Robert C. Seacord'un "Secure Coding in C and C++" kitaplarina bakmanizi tavsiye ederim.

Kanimca burada bahsedilen kural ve ornekler sizin isin icyuzunu anlamaniza cok faydali olacaktir.

bilhassa MISRA bir cok organizasyonda uygunluk gosterilmesi lazim gelen bir standardtir, ve c++ kaynak programlarinizi otomatik denetleyen yazilimlar mevcuttur. (ornegin FORD, BMW, MERCEDES, yada TOYOTA vs icin bir gomulu sistem yapiyorsaniz, kaynak programlarinizin otomobillerde kullanabilmesi icin bu standard'dan gecer not almaniz lazim!)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.