Yansıtma yoluyla özel yöntemlerin çağrıldığı durumla ilgilenmem gerekiyor mu?


12

Bir kütüphane oluştururken, özel yöntemlerin aynı sınıftaki diğer yöntemlerle değil, yansıma yoluyla başka bir kütüphane tarafından çağrıldığında beklendiği gibi çalışması gerekir mi?

Örneğin, özel bir yöntem şunu private DoSomething(int number)beklerse:

  • number sıfırdan farklı bir pozitif tamsayıdır ve:
  • özel değişken string abcnull değil ve boş bir dize değil,

ve tamamen, bu iki koşul eşleşmezse çirkin başarısız olur, sınıftaki tüm yöntemlerin çağrılmadan önce her zaman boş olmayan bir değer atayacağını ve buna sıfır olmayan bir tam sayı ileteceğini bilsem bile bu hataları ele almalıyım yöntem?abcDoSomething

Başka bir deyişle, yansıma yoluyla güvenli olmayan çağrılara karşı korunmayan kod , düşük kaliteli kod olarak kabul edilebilir mi, yoksa çağrının hiçbir şeyi bozmamasını sağlamak için yansıma kullanan arayanın mıdır?

Not: sorum yalnızca standart bir kitaplık grubunu kapsıyor. Bu, son derece güvenli olması gereken kodu kapsamaz (örneğin, birinin beklenmedik şekilde davranması veya çökmesi için yansıma kullanarak ilgilenebileceği durumlarda).


The Sınıf doğru bir şekilde belgelendiğinden, başka bir geliştiricinin bu yöntemi vb. Kırmayacağından emin olmak için yeterli birim sınamaları olduğundan.


türetilmiş sınıflar özel yöntemleri çağırabilecek mi?
oenone

Yanıtlar:


16

Yönteminizi özel olarak işaretleyerek niyetlerinizi ve bir sözleşmeyi belirlediniz. Yansımayı kullanarak bir müşteri kodu bu sözleşmeyi ihlal etmeyi seçebilir ve sonuç olarak sonuçlara katlanmak zorunda kalacaktır. Aynı şey protokollerde olur, işlerin çalışması için kurallara uyulmalıdır, aksi takdirde kötü şeyler olur.

Aynı sorun gibi şeyleri gördüğüm C ++ gibi diğer dillerde de oluşabilir

#define private public

Özetle - bu durumlarla ilgilenmeniz GEREKMEZ, arayan kişinin daha iyi bilmesi gerekir.


3
Ben insanlar (imzasız char *) sınıfları döküm gördüm ve değiştirmek istedikleri bir üye değişkenin bellek ofset doğrudan yazmak. Gözlerim kanadı.
Shawn D.

6
Sınıfınızı tehlikeli ayrıcalıklı kodlara karşı korumanın aslında imkansız olduğunu da ekleyeceğim . Bir şekilde kendinizi uygun olmayan yansıma kullanımına karşı korumayı başarırsanız, o zaman birisi muhtemelen doğrudan işlem belleğinizin üzerine yazarak gününüzü mahvetmenin farklı bir yolunu bulur. Savunma kodlaması nihayetinde azalan getiri noktasına ulaşır ve yansıma bu noktanın çok ötesindedir.
Aaronaught

5

Herhangi biri özel yöntemlerinizi çağırmak için yansıma kullanıyorsa, birisinin yanlış bir şey yaptığını gösteren bir işarettir. Kodu, tasarlanmadığı şekillerde kullanıyor veya dahili çalışmaların çok fazlasını gizliyor ve API'yi batırıyorsunuz.

Ama kulağa henüz o aşamada değilsin ve sadece önleyici olmaya çalışıyorsun. Benim düşüncem: Endişelenme. Özel bir yöntem sınır dışı olarak düşünülmelidir; Birisi bu sınırları kasten ihlal ederse, işler patlarsa onun sorunu budur.


0

Eh, bu kadar hep bunları kullanmadan önce yerel olmayan değişkenler doğrulamak için iyi bir fikir, ama bu konuda endişe olmaz bunun dışında. Diğerlerinin söylediği gibi, yöntemi öncelikle özel hale getirerek niyetlerinizi belirlediniz; sınıfınızın dışından arayan herkesin sıfır garantisi yoktur. Java'da çalışırken, özel yöntemlerime javadoc yorumları bile koymuyorum, çünkü diğer geliştiricilerin orada olduklarını bile bilmelerini istemiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.