Özel bir yöntem herkese açık bir yöntemdirse kod kokusu mu?


25

Aynı nesne örneğinin özel yönteminde genel yöntemi çağırmak bir kod kokusu mu?


AAMOI'nin size özel bir örneği var mı?
ocodo,

Hayır, şu anda değil. Sadece meslektaşlarımla tartıştığım bir olayı hatırladım. Burada da bazı görüşler almak istedim.
Eimantas

5
Genellikle bağlamın kısaltmasını bulabilirim, ama AAMOI kesinlikle bakmak zorunda kaldım
Carson Myers

@Carson - bir şey buldun mu?
Eimantas

4
İlgi Alanları Olarak
Carson Myers

Yanıtlar:


33

Fena değil kokusu. Bu gerekli olabilir, neden yanlış olduğundan şüpheleniyorsun? Atom seviyesindeki bir yöntem, görevi yapan bağımsız bir varlıktır. Bir görevi yaptığı sürece, kendisine erişimi olan herhangi biri, görevi yerine getirmek için arayabilir.


Katılıyorum. Bazı yöntemler, hem dahili hem de harici arayanlar için yararlı olan işlevselliği sağlar. Genel yöntem iç uygulamaya çok özgüyse, bir kırmızı bayrak olabilir, ancak o zaman bile her sınıf kendi içini gizlemeye yönelik değildir. Örneğin, bir konteyner soyut türü katmanının altındaki bir veri yapısı "aracı" katmanına sahibim, örneğin - bu şekilde, diğer konteynerlerin altındaki diğer veri yapıları için bazı veri yapısı kodunu yeniden kullanabilirim.
Steve314

20

Kod kokusu? Evet, gerçekten kötü bir durum değil, ama sınıfın çok fazla sorumluluğu olabileceğinin iyi bir göstergesi.

Sınıfın farklı nesnelere ayrılması gerekebileceğinin bir işareti olarak kabul edin, özel yöntemlerin kesinlikle temiz bir OO tasarımında aynı nesnenin genel yöntemlerini çağırması gerekmez.

Tabii ki, sınıfı kontrol ettikten sonra ve yöntem çağrısının nedenleri açıksa, genel olarak sınıfın özel olması için faydalı yöntemlerin olmasını beklersiniz, ancak bir tanesi yeterince faydalısa, kamuya açık olun ve diğer yöntemlerden yararlanın, bu yöntemlerin de genel olmasını beklerdim.

Tüm kod kokularında olduğu gibi, bu daha fazla kod incelemesi için bir motivasyondur, rasyonelleştirir ve belki de refaktördür, ancak alarm için bir neden değildir.


5
'Alarm nedeni değil' için +1. Pek çok kez bir 'koku' görüyoruz ve anında düşünmeden refactor moduna giriyoruz.
Michael K

SRP için +1. Bir dekoratörün çalışmadığı bir duruma rastladım, çünkü dekore edilmiş sınıf, dekoratör atlayarak kendi ortak işlevini çağırıyordu. Çözüm: sınıfı ikiye bölmek ve dekore edilmiş bağımlılığı enjekte etmek.
Jon Hulka

18

Bu sınıfın kaynak kodunu okumamış olan biri onu alt sınıfa sokmaya kalkarsa ve kamu yöntemini geçersiz kılarsa, hoş olmayan sürprizlere yol açabilir. Bunun gerçek bir endişe olup olmadığı açıkça sizin durumunuza bağlıdır. Belki de kamu yöntemini ve hatta dersi final yapmayı düşünmelisin.


Niye ya? Eğer üzerine yazılmış bir kamu metodu hoş olmayan sürprizlere yol açarsa, bu metodu kimin aradığı önemli mi?
user281377

4
Evet öyle. Bir genel yöntemi geçersiz kılmak başka bir genel yöntemi ihlal ederse, bu diğer yöntemi de geçersiz kılabilirim. Özel bir yöntemi kırarsa, yapabilirim ....?
Kim

5
Bir kamu yöntemini geçersiz kılmaktan kaynaklanan hoş olmayan bir sürpriz, kendi başına bir kod kokusudur. Aslında bir kod kokusu.
Larry Coleman

Kim: Eğer yöntem herkese açıksa, diğer sınıfların da bu yöntemi dediği varsayılmalıdır ...
user281377

@Larry: Kesinlikle! Herkese açık diyen özel bir yöntem (genellikle uygulamaya özgü varsayımlar içerir), kamu yöntemini geçersiz kılmanın bazı şeyleri bozması olasılığını artırır.
Kim

5

Genelleştirebileceğimizi sanmıyorum.

Her şey içeriğe çok fazla bağlı.

Diğer sınıflar tarafından kullanılan bir sınıfta bir kamu yararı yöntemi ve aynı sınıfta bazı özel yöntemler olabilir.


5

Hayır. Bu durumda başka ne yapılmalı? Özel yöntemi herkese açık mı yoksa herkese açık yöntemi gizli mi yapmalısınız? Kopyala-Kodun genel yönteminden özeline mi yapıştırılması?


Veya genel yöntemin, diğer özel yöntem tarafından çağrılan (yeni) özel bir yönteme yetki vermesini sağlayın. Ama neden rahatsız ediyorsun?
Lawrence Dol

4

HAYIR , burada kötü bir koku yok.

List ile bir sıra arayüzünü uygularsak, sıranın kolayca uygulanabilmesi için doğru Liste fonksiyonlarını çağırmak kötü bir koku olabilir mi?

eğer bir şeye sahipseniz ve onu başka bir şeye (sarıcı gibi) dönüştürmek istiyorsanız, o zaman kötü bir koku değildir, kod işlev düzeyinde hareket eden tasarım deseni ile yeniden kullanılabilirliği (işlev bir nesnedir?)


2

Bunun eski bir yazı olduğunu biliyorum, ama işte tartıştığım bir şey. Bunu bir kod kokusu olarak kabul ediyorum ve neden bunu yapmak istediğinizi anlayamıyorum. Özel bir yöntem bir genel yöntem çağırması gerekiyorsa, genel yöntemin içeriği her iki yöntemin de arayabileceği özel bir yönteme alınmalı ve yerleştirilmelidir. Niye ya?

  1. Genel yöntem, kodunuzu dahili olarak uyguladığınızda bir kez gerekli olmayan testler içerebilir. Bir UserObj alabilir ve örneğin kullanıcı izinlerini test etmek isteyebilir.

  2. Bir kamu çağrısından sonra, nesneyi kilitleme zorunluluğunuz olabilir, iş parçacığı kullanıyorsanız, bu nedenle dahili olarak bir genel yönteme geri dönmek istemezsiniz.

  3. Benim görüşüme göre dairesel hatalar ve sonsuz döngüler ve mem dışı özel durumlar dışında kalma olasılığı daha yüksektir.

  4. Sade ve basit, kötü tasarım ve "tembel". Kamu yöntemleri dış dünyaya erişim sağlar. Zaten içerideyken dışarı çıkmak için hiçbir sebep yok.


1
Mevcut ortak yöntem birçok başka sınıf tarafından çağrılırsa ne olur? Özel yapmak, onu kıracak. Genel yöntemlerin sadece bu sınıfa değil, başka nedenlerle başka nedenlerle çağrıldığını da unutmayın. Neden kamu yöntemleri var.
Michael Durrant,

'Kamusal yöntemin içeriğinin özel bir yönteme götürülmesi ve yerleştirilmesi ...' 'demiştim. Aynı işlevi yeniden kullanması gereken diğer özel yöntemlerin de olacağı gibi.
Mark Graham

Yani başka bir sebep olmadan başka bir yöntem ekliyorsunuz - peki, çünkü bunu bir "kod kokusu" olarak ilan ettiniz. Anlamsız yöntemler daha kötü bir kod kokusudur.
gnasher729

Maalesef, yukarıdaki birkaç nedeni listelemedim. Yazdığım kodların çoğu işletme sistemleri içindir, birçok sınıf rollere bağlı olarak kullanıcılarla sınırlıdır. Birçok kamu yöntemi, kullanıcı izinlerini ve param'leri test eder. Neden dünyadaki işlevlerini tekrar kullanmak ve kullanıcı izinlerini tekrar test etmek için aynı ortak yöntemi geri çağırmak isteyeyim?
Mark Graham

Hayatımda hiçbir zaman özel bir yöntemden bir kamu yöntemi çağırmam gerekmedi. Sadece görünüyor ve bana çok yanlış geliyor. Çoğu insanın sorun olmadığını düşünmesine gerçekten şaşırdım.
Tuzak

2

Tersini düşünün. Özel bir yöntemle ve size ne bir kamu yöntemde işlevselliği gerek olamazdı özel birinden elde edilen kamu yöntemini çağırın. Sen ne yapardın?

  • Yinelenen bir özel yöntem oluştur? Yok hayır
  • Durum için özel bir kamu yöntemi oluşturun? Yok hayır
  • Genel yöntemleri çağırabilecek özel bir yöntem mi arıyorsunuz? Yok hayır
  • Bunu yapabilen bir çeşit süper var mı? Yok hayır

Cevap, işlevselliği ortak bir yöntemde istediğinizde, bu yöntemi bu sınıfın yöntemlerinden veya diğer sınıflardan arayabilmeniz gerektiğidir.


1

Kodumda sıklıkla tembel yük alıcıları yaratıyorum, bu da nesnenin ilk talep edildiğinde başlatıldığını ve daha sonra aynı başlatılan nesneyi yeniden kullandığını söylüyor. Bununla birlikte, tembel bir yük kullanılarak başlatılan bir nesne, belirli bir noktada mutlaka başlatılmayabileceği anlamına gelir. Kafamı çağrılar sırasının etrafına sarmak yerine, o nesnenin zaten başlatıldığını veya başka bir yöntemde tembel bir yükün aynı kodunu tekrarladığını bildiğim için, bu nesneye ihtiyaç duyduğumda tembel yükleyiciyi çağırırım.

Genel yöntemleri akıllı bir şekilde kullanabildiğiniz gibi, bunları yanlış da kullanabilirsiniz. Buna bir örnek, başka bir özel yöntemi çağırmadan önce parametrelerini işleyen genel bir yöntem olabilir. Aynı parametrelere sahip olduğunuz için bu ortak yöntemi rasgele olarak adlandırmak yanlış olur. Hata incedir ancak her şeyden çok bir tasarım hatasıdır ve kamu yönteminin parametreleri yerine iç yöntem parametreleriyle yönetmeyi öğrenmenizi gerektirir.

Sorunuzu cevaplamak için, doğru kullanıyorsanız kesinlikle kötü bir kod değil.


1

Kendine sorman gereken soru, sınıfının neden sınıfının müşterileriyle aynı ihtiyaca sahip olduğudur? Genellikle bir sınıfın müşterilerinden çok farklı ihtiyaçları vardır. Öyleyse evet, bu senin de bir göstergesi

(a) özel olması gereken herkese açık olarak göstermek veya

(b) sınıfın davranışı yeterince dar değil (tek sorumluluk ilkesi düşünün).

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.