Bir işlev çok kısa olabilir mi?


125

Ne zaman kendimi aynı mantığı bir defadan fazla yazıyorsam, genellikle bir fonksiyona yapıyorum, bu yüzden uygulamamda bu mantığı sürdürmek için tek bir yer var. Yan etki, bazen aşağıdakiler gibi bir veya iki satır işleviyle bitmemdir:

function conditionMet(){
   return x == condition;
}

VEYA

function runCallback(callback){
   if($.isFunction(callback))
     callback();
}

Bu tembel mi yoksa kötü bir uygulama mı? Sadece soruyorum çünkü bu daha fazla sayıda fonksiyonun sonuçlanmasına neden olarak çok küçük bir mantık parçasını gerektirir.


3
Hayır, çok kısa değil. C # 'koşul bir araya geldi' bir özellik olarak zarif olurdu ve kullanmayı düşünürdüm Assert.AreEqual<int>(expected, actual, message, arg1, arg2, arg3, ...);. İkincisi olduğu gibi iyidir. Potansiyel bir istisna / vb. Atılıp atılmayacağını belirten isteğe bağlı bir bool bayrağını ekleyeceğim. geri arama bir işlev değilse.
İş

38
Evet, yalnızca bir durumda: function myFunction () {}
Spooks

5
def yes(): return 'yes'
dietbuddha

3
@Spooks - Tüyleri burada bölüyorum ama boş fonksiyonlar en azından adaptör sınıfları için geçerlidir, örneğin, download.oracle.com/javase/6/docs/api/java/awt/event/… adresindeki MouseMotionAdapter . Tabii ki bu sadece dil kısıtlamaları etrafında çalışmak için bir yol.
Aleksi Yrttiaho

3
@dietbuddha: Sadece yeni gereksinimler değişti - şimdi önümüzdeki hafta bir demo için iki dili desteklemesi gerekiyor. "Def yes ()" yazan adam, "def yes (: (IsFrench ()? 'Oui': 'Evet')" olarak değiştirmeden önce çok memnun olduğunu hissetti.
Andrew Shepherd

Yanıtlar:


167

Hehe, ah, Bay Brown, tanıştığım tüm geliştiricileri işlevlerini bu kadar küçük tutmaya ikna edebilseydim, inan bana, yazılım dünyası daha iyi bir yer olurdu!

1) Kod okunabilirliği on kat artar.

2) Okunabilirlik nedeniyle kodunuzun sürecini anlamak çok kolay.

3) KURU - Kendini Tekrar Etme - Buna çok iyi uyuyorsun!

4) Test Edilebilir. Küçük fonksiyonlar, test etmek için çok sık gördüğümüz 200 hat yönteminden milyonlarca kez daha kolaydır.

Oh ve performans açısından "fonksiyon atlaması" için endişelenmeyin. "Release" sürümleri ve derleyici optimizasyonları bizim için çok iyi bir şekilde ilgileniyor ve performans, sistem tasarımında başka bir yerde zamanın% 99'u.

Bu tembel midir? - Tam tersi!

Bu kötü bir uygulama mı? - Kesinlikle hayır. Katran toplarından veya bu kadar yaygın olan "Tanrı Nesneleri" nden bu şekilde yöntemlerin çekilmesi daha iyidir.

İyi çalışmaya devam edin, meslektaşım;)


40
Soruyu cevaplamıyorsunuz, burada daha aşırı uygulamaları sorgulanan kuralı sadece vaaz ediyorsunuz.

4
Sık sık değil, sadece 1 artı oyla sinir bozucu sınırlama bulmak. Ancak, bu cevap için, + 1 adalet gibi görünmüyor.
Bevan

4
+5 ... oh sadece +1 yapabilir, oh peki! MeshMan'ı desteklemek için aşağıdaki kitabı Robert C. Martin Clean kodu ile öneriyorum . Bu kitap şimdi programlamamı gerçekten değiştiriyor.
Eric-Karl

10
Çok sevilebilir bir cevap, ama çoğu zaman aynı fikirde değilim: 1) Son derece küçük fonksiyonlar, her bir fonksiyon için gerekli tüm tesisat nedeniyle, daha fazla kodla sonuçlanır. Bu, özellikle büyük bir proje için okunabilirliği azaltabilir. Ayrıca, dile bağlı. 2) Tamamen 1. maddeye bağlı ve bu nedenle soru ile ilgisi yok. 3) Ne? runCallback, "geri arama" yı dört kez tekrarlar ve üç kez, tek bir işlevi çalıştırmak için aynı değişkeni ifade eder. 4) 200+ çizgi yöntemi elbette test edilebilir değildir, ancak bundan bir çizgiye giden uzun bir yol vardır.
l0b0

10
-1: Buradaki en korkutucu şey, bu cevaba verilen oyların sayısı.
Luca,

64

Yeniden yapılandırılmış bir yöntemin şu durumlarda çok kısa olduğunu söyleyebilirim:

  • İlkel bir işlemi çoğaltır, yöntem yapmaktan başka bir amaç için değil:

Ör:

boolean isNotValue() {
   return !isValue();
}

veya...

  • Kod yalnızca bir kez kullanılır ve amacı bir bakışta anlaşılması kolaydır.

Ör:

void showDialog() {
    Dialog singleUseDialog = new ModalDialog();
    configureDialog(singleUseDialog);
    singleUseDialog.show();
}

void configureDialog(Dialog singleUseDialog) {
    singleUseDialog.setDimensions(400, 300);
}

Bu geçerli bir model olabilir, ancak geçersiz kılmak veya bu kodu başka bir yerde tekrar kullanmak istemediğim sürece, bu örnekte configureDialog () yönteminin satır içi olurdum.


7
İkinci durumda tek hat yöntemini ayırmak, arama yöntemlerini soyutlama seviyesini tutarlı tutmak için faydalı olabilir. Bu mantık kullanılırsa, verilen örnek çitin üzerindedir: diyalog göstermek için tam piksel genişliği ve yüksekliği çok mu ayrıntılı?
Aleksi Yrttiaho

2
"İsNotValue ()" yöntemi hatalı bir şekilde adlandırılmış ve asıl etki alanı sorusunu adlandırmak için yeniden adlandırılmalıdır.

4
@Aleksi: Katılmıyorum; Ayrıntılar bu örnekte showDialog () yönteminde zaten gizlidir; bunu çift-inceltmeye gerek yok. Örnek, yalıtılmış bir kullanım durumu gösterme amaçlıdır; farklı durumlarda farklı diyalog konfigürasyonlarında bir desene ihtiyaç duyulursa, model kurulduktan sonra geri dönüp refactor yapmak mantıklı olacaktır.
RMorrisey

1
@Thorbjorn: Mantığı açık olmayan bir iş alanı sorusunu yanıtlarken bunun için bir dava görebiliyordum. Sadece, fazla pişmiş olan bazı vakalar olduğuna işaret ediyorum.
RMorrisey

3
Belki bu nitpicking, ancak örneklerinizde sorunun fonksiyonun çok kısa olmadığını, ancak tanımlayıcı bir değer eklemediğini iddia ediyorum.
keppla

59

Bir işlev çok kısa olabilir mi? Genel olarak hayır.

Aslında bunu sağlamanın tek yolu:

  1. Tasarımınızdaki tüm sınıfları buldunuz
  2. İşlevlerin sadece bir şeyi yapıyor.

İşlevlerinizi mümkün olduğunca küçük tutmaktır. Ya da başka bir deyişle, daha fazla ayıklamadığınız sürece, fonksiyonlarınızdan fonksiyonları ayıklayın. Ben buna "Sen düşene kadar çıkar" derim.

Bunu açıklamak için: Bir işlev, değişkenlerle iletişim kuran işlevsellik parçalarına sahip bir kapsamdır. Bir sınıf aynı zamanda değişkenlerle iletişim kuran işlevsellik parçalarına sahip bir kapsamdır. Bu yüzden uzun bir işlev her zaman küçük yöntemle bir veya daha fazla sınıfla değiştirilebilir.

Ayrıca, ondan başka bir işlevi çıkarmanıza izin verecek kadar büyük olan bir işlev, tanım gereği birden fazla şey yapıyor . Eğer Yani eğer olabilir başka bir işlev ayıklamak, sen gerektiğini o fonksiyonu ayıklamak.

Bazı insanlar bunun fonksiyonların çoğalmasına yol açacağından endişe ediyor. Haklılar. Olacak. Bu aslında iyi bir şey. Bu iyi çünkü fonksiyonların isimleri var. İyi adlar seçme konusunda dikkatli iseniz, bu işlevler diğer insanları sizin kodunuz üzerinden yönlendiren işaret mesajları olarak işlev görür. Aslında, iyi adlandırılmış ad alanlarının içindeki iyi adlandırılmış sınıfların içindeki iyi adlandırılmış işlevler, okuyucularınızın kaybolmamasını sağlamak için en iyi yollardan biridir.

Cleancoders.com at Clean Code Bölüm III'de bu konuda çok daha fazlası var


5
Bob Amca! Seni burada görmek güzel. Beklendiği gibi harika tavsiyeler. Daha önce "Düşene dek ayıkla" terimini daha önce hiç duymamıştım ve bu terimi kesinlikle Pazartesi günü ofiste kullanacaksınız;).
Martin Blore

1
1 numaralı noktanıza odaklanmaya istekli misiniz? Örnek olarak harika olacağını açıklamak.
Daniel Kaplan,

53

Vay, bu cevapların çoğu hiç de yardımcı olmuyor.

Kimliği tanımı olan hiçbir fonksiyon yazılmamalıdır . Diğer bir deyişle, işlev adı yalnızca işlevin İngilizce olarak yazılmış kod bloğuysa, işlev olarak yazmayın.

İşlevinizi conditionMetve bu diğer işlevi göz önünde bulundurun , addOne(paslı JavaScript'im için beni affedin):

function conditionMet() { return x == condition; }

function addOne(x) { return x + 1; }

conditionMetuygun bir kavramsal tanımdır; addOnebir totolojidir . conditionMetiyidir, çünkü conditionMet"koşul bir araya geldi" diyerek neyin gerektirdiğini bilmiyorsunuz , ancak addOneİngilizce okuduysanız neden aptalca olduğunu görebilirsiniz :

"For the condition to be met is for x to equal condition" <-- explanatory! meaningful! useful!

"To add one to x is to take x and add one." <-- wtf!

Hâlâ kutsal olabilecek bir şeyin aşkı için, lütfen, totolojik işlevler yazmayın!

(Ve aynı nedenle, her kod satırı için yorum yazmayın !)


Daha karmaşık dil kurgularından bazıları yabancı olabilir veya okunması zor olabilir, bu da bunu faydalı bir numara haline getirir.

3
Bir fonksiyona tam olarak ne yapılması gerektiği konusunda anlaşılan, büyük ölçüde içinde yazılan dile bağlı olacaktır. Eğer VHDL gibi bir dilde olsaydınız addOne gibi bir fonksiyon aslında bir tanesini eklemenin anlamını tanımladığınız durumlarda kullanışlıdır. ikili veya sayı teorisi seviyesi. Dışarıda hiçbir dilin kriptik olmadığını, pratik programcılar için (belki brainf # ck) bile okumayı zorlaştıracağını düşünmek isterdim, ancak durum söz konusuysa, aynı fikir geçerli bir şekilde İngilizce'den bir çeviri olduğu için geçerli olacaktır. bu dile - yani isim tanımla aynı değil.
Rei Miyasaka

1
Haskell standart kütüphanesinden bazı şeylerin kimlik fonksiyonundan bahsediyorum - bundan daha fazla "tautological" alabileceğinizi sanmıyorum :)
hugomg

1
@missingno Bah, bu hile: D
Rei Miyasaka

5
İşlevleri içerikleri yerine amaçlarına göre adlandırırsanız, hemen aptalca dururlar. Yani örnekleriniz örneğin olabilir function nametoolong() { return name.size > 15; }ya da function successorIndex(x) { return x + 1; } Yani işlevlerinizle ilgili sorun aslında onların adlarının kötü olması.
Hans-Peter Störr

14

Bir yorum ekleyerek bazı kodun amacının geliştirilebileceğini düşünüyorsanız, o yorumu eklemek yerine, kodu kendi yöntemine çıkartın. Kod ne kadar küçük olursa olsun.

Örneğin, kodunuz şöyle görünecekse:

if x == 1 { ... } // is pixel on?

bunun yerine şunun gibi görünmesini sağlayın:

if pixelOn() { ... }

ile

function pixelOn() { return x == 1; }

Başka bir deyişle, yöntem uzunluğu ile ilgili değil, kendi kendini belgeleyen kodla ilgilidir.


5
Değerli meslektaşım yazabileceğinizi de belirtiyor if x == PIXEL_ON. Bir sabit kullanmak, bir yöntem kullanmak kadar açıklayıcı olabilir ve biraz daha kısadır.
Tom Anderson

7

Bence aynen yapmak istediğin şey bu. Şu anda bu işlev yalnızca bir veya iki satır olabilir, ancak zamanla büyüyebilir. Ayrıca daha fazla işlev çağrısı yapmak, işlev çağrıları okumanıza ve içeride neler olduğunu anlamanıza olanak sağlar. Bu, kodunuzu çok daha kuru bir şekilde KURU (Kendinizi Tekrarlama) yapar .


4
Öyleyse daha sonra çarpanlara ayırmanın nesi yanlış, ne zaman ihtiyacın olduğunu kanıtlayabildiğin zaman, şimdi yerine, sadece kilo aldığında?
dsimcha

İşlevler kendi kendine büyümez. IMHO örnekler berbat. conditionMetçok genel bir isim ve argüman almadığı için bazı durumları test ediyor? (x == xCondition) çoğu dilde ve 'xConditition' kadar ifade edici olan durumlardadır.
kullanıcı bilinmeyen

Evet, bu yüzden kodunuzda% 75 genel gider + masrafınız olsun ister misiniz? Singe liner 3 satır olarak yazılmıştır, aslında% 300'dür.
Kodlayıcı

5

Gördüğüm diğer tüm yazılarla aynı fikirdeyim. Bu iyi bir tarz.

Böyle küçük bir yöntemin ek yükü, optimizer'ın aramayı en iyi duruma getirip kodu sıraya sokabilmesi nedeniyle sıfır olabilir. Bunun gibi basit kod, optimize edicinin en iyi işi yapmasını sağlar.

Netlik ve basitlik için kod yazılmalıdır. Bir yöntemi iki rolden biriyle sınırlamaya çalışıyorum: karar vermek; veya iş yapmak. Bu bir satır yöntemi üretebilir. Bunu ne kadar iyi yaparsam kodumu o kadar iyi bulurum.

Bunun gibi kodlar, iyi kodlama uygulaması olan yüksek uyum ve düşük bağlanma eğilimindedir.

EDIT: Yöntem isimleri üzerine bir not. Yöntemin nasıl yaptığını belirten olmayan bir yöntem adı kullanın. Ben verb_noun (_modifier) ​​iyi bir adlandırma şemasıdır. Bu, Select_Customer_Using_NameIdx yerine Find_Customer_ByName gibi isimler verir. İkinci durum, yöntem değiştirildiği zaman yanlışlığa meyillidir. İlk durumda, Müşteri veritabanı uygulamasının tamamını değiştirebilirsiniz.


Satır içi ifadelerden bahsetmek için +1, performans ve kısa fonksiyonlardaki ana düşünceyi kullanın.
Garet Claborn,

4

Bir kod satırını bir işleve yeniden yerleştirmek aşırı görünüyor. Ver loooooong / comples lines veya expessions gibi istisnai durumlar olabilir, ancak gelecekte fonksiyonun büyüyeceğini bilmediğim sürece bunu yapmam .

ve ilk örneğiniz küresel kullanımdaki ipuçlarını (koddaki diğer konulardan bahsedebilir veya konuşmayabilir), onu daha da yeniden düzenler ve bu iki değişkeni parametre olarak yapardım:

function conditionMet(x, condition){
   return x == condition;
}
....
conditionMet(1,(3-2));
conditionMet("abc","abc");

conditionMetÖrnek olabilir durumu gibi uzun ve tekrarlayan ise yararlı olabilir:

function conditionMet(x, someObject){
   return x == ((someObject.valA + someObject.valB - 15.4) / /*...whole bunch of other stuff...*/);
}

1
İlk örneği, küresel ipuçlarını vermez. Herhangi bir şey varsa, değişkenlerin çoğunun nesne üzerinde olduğu yüksek düzeyde yapışkan bir sınıfta birleşik bir yöntemdir.
Martin Blore,

7
Bu conditionMetfonksiyon sadece ayrıntılı bir ==operatördür. Bu kesinlikle işe yaramaz.

1
Kesinlikle globals kullanmıyorum. @MeshMan, tam da buradaki örnek ... sınıftaki bir yöntem.
Mark Brown,

1
@ Mark Brown: @MeshMan: Tamam, kod örneği kesin bilmek çok belirsiz olması galiba ...
FrustratedWithFormsDesigner

conditionMet (x, relation condition) {Burada, x, '==' ve ilişkinizi geçtiğin yerde kokluyorum . O zaman '<', '>', '<=', '! =' İçin kodu tekrar etmenize gerek yok. Diğer tarafta - çoğu dilde bu yapılar operatör olarak inşa edilmiştir (x == condition). Atomik ifadelerin işlevleri çok uzak bir adımdır.
kullanıcı bilinmeyen

3

Bunu düşün:

Basit bir çarpışma algılama fonksiyonu:

bool collide(OBJ a, OBJ b)
{
    return(pow(a.x - b.x, 2) + pow(a.y - b.y, 2) <= pow(a.radius + b.radius, 2));
}

Bu "basit" bir liner'i kodunuzda her zaman yazdıysanız, sonunda bir hata yapabilirsiniz. Artı, bunu tekrar tekrar yazmak gerçekten zor olurdu.


Burada C ile uğraşıyorsak, kötüye kullanabiliriz #define;)
Cole Johnson

Boyutlarınız veya mesafeleriniz çok büyürse, bunu daha yavaş ama taşmaya dayanıklı hipot ile değiştirmek isteyebilirsiniz . Bu, açıkça, bir kez yapmak için çok daha kolaydır.
Matt Krause

2

Hayır, bu nadiren sorun olur. Şimdi eğer birisi hiçbir işlevin bir işlev satırından daha uzun olması gerektiğini düşünürse (sadece bu kadar basit olabilseydi), bu bir problem olurdu ve bir şekilde tembel olurdu çünkü ne uygun olduğunu düşünmezler.


Bunu kod satırlarında saymazdım ama ifadelerde. "(x == condition)" atomiktir, bu yüzden birden fazla kez kullanılırsa VE function isAdult () = { age >= 18; }kesinlikle veya kesinlikle olmasa bile, bir yöntem / işleve koyardım isAtLeast18.
kullanıcı bilinmeyen

2

Çok kısa olduklarını söyleyebilirim ama bu benim öznel görüşüm.

Çünkü:

  • Yalnızca bir veya iki kez kullanılırsa, işlev oluşturmak için hiçbir neden yoktur. Defs için atlama emmek. Özellikle şaşırtıcı derecede hızlı VS ve C ++ kodu ile.
  • Sınıfa genel bakış Binlerce küçük işleviniz olduğunda, bu beni kızdırıyor. Sınıf tanımlarını görüntüleyebildiğimde ve hızlıca ne yaptığını görebildiğimde zevk alıyorum, SetXToOne, SetYToVector3, MultiplyNumbers, + 100 setters / getters.
  • Çoğu projede bu yardımcılar iki cevher çıkarma aşamasından sonra bir kilo alırlar ve daha sonra eski kodlardan kurtulmak için "hepsini ara" -> silersiniz, genellikle ~% 25 +.

Uzun olan işlevler kötüdür, ancak 3 satırdan daha kısa olan ve yalnızca 1 şey yapan işlevler eşit derecede kötü IMHO'dur.

Öyleyse sadece küçük işlevler yazalım derdim:

  • 3+ kod satırı
  • Ufak tefeklerin kaçırabileceği şeyler var mı (bilmiyorum)
  • Ek doğrulama yapar
  • En az 3x kullanılır veya kullanılır
  • Sık kullanılan arayüzü basitleştirir
  • Bir sonraki refactoring sırasında ölü ağırlık olmayacak
  • Özel bir anlamı var, örneğin, şablon uzmanlığı veya başka bir şey
  • Bazı tecrit işleri yapar - const referansları, değişken parametreleri etkiler, özel üye alımı yapar

Bahse girerim bir sonraki geliştirici (kıdemli) tüm SetXToOne işlevlerinizi hatırlamaktan daha iyisini yapacak. Böylece her iki şekilde de kısa sürede ölü kiloya dönecekler.


1

Hayır örnek sevmiyorum. 1, bunun genel adı bcause.

conditionMetgenel gibi görünmüyor, bu yüzden belirli bir durum için duruyor? Sevmek

isAdult () = { 
  age >= 18 
}

Bu iyi olurdu. Anlamsal bir fark ise

isAtLeast18 () { age >= 18; } 

benim için iyi olmazdı.

Belki de sıklıkla kullanılır ve daha sonra değişebilir.

getPreferredIcecream () { return List ("banana", "choclate", "vanilla", "walnut") }

de iyi. Birden çok kez kullanarak, sadece tek bir yeri değiştirmeniz gerekir, gerekirse - belki çırpılmış krema yarın mümkün olur.

isXYZ (Foo foo) { foo.x > 15 && foo.y < foo.x * 2 }

atomik değildir ve size güzel bir test fırsatı sunmalıdır.

Bir işlevi geçmeniz gerekiyorsa, elbette, ne istersen onu ilet ve aksi halde aptalca görünen işlevler yaz.

Fakat genel olarak, çok kısa olan fonksiyonlardan çok uzun olan fonksiyonlar görüyorum.

Son söz: Bazı fonksiyonlar sadece uygun görünüyor çünkü çok ayrıntılı yazılmışlar:

function lessThan (a, b) {
  if (a < b) return true else return false; 
}

Görüyorsanız, bunun aynı olduğunu

return (a < b); 

sorun yaşamayacaksın

localLessThan = (a < b); 

onun yerine

localLessThan = lessThan (a, b); 

0

Kod gibi kod yok!

Basit tutun ve işleri zorlaştırmayın.

Tembel olmak değil, işini yapıyor!


0

Evet, kısa kod işlevine sahip olmak tamam. “Alıcı”, “ayarlayıcı”, “alıcı” gibi yöntemlerde, önceki cevaplarda belirtildiği gibi çok yaygındır.

Bazen, bu kısa "erişimciler" işlevleri sanaldır, çünkü alt sınıflarda geçersiz kılındığında işlevlerin daha fazla kodu olacaktır.

Çok kısa, iyi, pek çok işlevde, genel veya yöntemlerde işlev görmemenizi istiyorsanız, genellikle doğrudan geri dönüş yerine bir "sonuç" değişkeni (pascal stili) kullanırım, bu hata ayıklayıcı kullanırken çok yardımcı olur.

function int CalculateSomething() {
  int Result = -1;

   // more code, maybe, maybe not

  return Result;
}

0

Çok kısa asla bir problem değildir. Kısa işlevlerin bazı nedenleri:

Tekrar Kullanılabilirlik

Örneğin, bir set yöntemi gibi bir fonksiyonunuz varsa, parametrelerin geçerli olduğundan emin olmak için bunu iddia edebilirsiniz. Bu kontrol, değişkenin ayarlandığı her yerde yapılmalıdır.

İdame

Gelecekte değişebileceğini düşündüğünüz bazı ifadeleri kullanabilirsiniz. Örneğin, şimdi bir sütunda bir sembol gösterirsiniz, ancak daha sonra başka bir şeye (veya bir bip sesine) dönüşebilir.

tekdüzelik

Örneğin cephe deseni kullanıyorsunuz ve bir fonksiyonun yaptığı tek şey argümanları değiştirmeden fonksiyonu diğerine geçirmek.


0

Bir kod bölümüne bir ad verdiğinizde, esasen bir ad vermek içindir . Bu, birkaç nedenden dolayı olabilir, ancak önemli olan nokta, programınıza ekleyen anlamlı bir isim verebilmenizdir . "AddOneToCounter" gibi isimler hiçbir şey eklemeyecek, ama conditionMet()olacaktı.

Snippet'in çok kısa veya çok uzun olup olmadığını anlamak için bir kurala ihtiyacınız varsa, snippet için anlamlı bir ad bulmanın ne kadar sürdüğünü göz önünde bulundurun. Makul bir süre içinde yapamıyorsanız, pasaj uygun bir boyutta değildir.


0

Hayır, ama çok kısa olabilir.

Unutmayın: Kod bir kez yazılır, ancak birçok kez okunur.

Derleyici için kod yazmayın. Kodunuzu korumak zorunda kalacak gelecekteki geliştiriciler için yazın.


-1

Evet canım, İşlev daha küçük ve daha küçük olabilir ve iyi ya da kötü olup, kullandığınız Dile / Çerçeveye bağlıdır.

Bence çoğunlukla Ön Uç Teknolojileri üzerinde çalışıyorum, Küçük İşlevler çoğunlukla yardımcı işlevler olarak kullanılıyor, küçük filtrelerle çalışırken ve uygulamanızda aynı mantığı kullanırken bunları bir sürü gibi kullanmak zorunda kalacaksınız. Uygulamanızın çok ortak bir mantığı varsa, o zaman bir ton küçük işlev gibi olacak.

Ancak ortak bir mantığa sahip olmadığınız bir uygulamada küçük işlevler yapmak zorunda değilsiniz, ancak kodunuzu yönetmeniz ve anlamanızın kolaylaştığı bölümlere bölebilirsiniz.

Genel olarak büyük kodunuzu küçük fonksiyonlara bölmek çok iyi bir yaklaşımdır. Modern çerçevelerde ve dillerde, örneğin, buna mecbur kalacaksınız.

data => initScroll(data)

2017 JavaScript ve Typescript’te adsız bir işlevdir

getMarketSegments() {
 this.marketService.getAllSegments(this.project.id)
  .subscribe(data => this.segments = data, error => console.log(error.toString()));
}

Yukarıdaki kodda 3 İşlev bildirimi ve 2 işlev çağrısı görebilirsiniz. Bu, Typcript 4 ile Açısal 4'te basit bir Servis Çağrısıdır. Gereksinimleriniz olarak düşünebilirsiniz

([] 0)
([x] 1)
([x y] 2)

Yukarıdakiler clojure dilinde 3 isimsiz fonksiyondur. Language

(def hello (fn [] "Hello world"))

Yukarıdakilerden biri, clojure'da işlevsel bir bildiridir

Yani evet FONKSİYONLAR daha küçük olabilir, ancak aşağıdaki gibi işlevleriniz varsa iyi ya da kötü olsun:

incrementNumber(numb) { return ++numb; }

Peki, bunu yapmak iyi bir uygulama değil, peki ya bu işlevi Angular Framework’te yaptığımız gibi bir HTML etiketinde kullanıyorsanız, Angular HTML Şablonlarında Artırma veya Azaltma desteği olmasaydı, o zaman bunun çözümü olurdu. ben mi.

Başka bir örnek alalım

insertInArray(array, newKey) {
 if (!array.includes(newKey)) {
   array.push(newKey);
 }
}

Yukarıdaki örnek, Angular HTML Şablonları içindeki dizilerde oynatırken bir zorunluluktur. Bu yüzden bazen küçük fonksiyonlar yaratmanız gerekebilir


-2

Şu anda verilen neredeyse cevap ile katılmıyorum.

Son zamanlarda, tüm sınıf üyelerini aşağıdaki gibi yazan bir meslektaş buldum:

 void setProperty(int value){ mValue=value; }
 int getProperty() const { return (mValue); }

Bu sporadik durumlarda iyi bir kod olabilir, ancak çok ve çok özelliklere sahip birçok sınıf tanımladığınızda kesinlikle değil. Bununla, yukarıdaki gibi yöntemlerin yazılmayacağını söylemek istemiyorum. Ancak, kodun çoğunu gerçek mantığın "sarmalayıcı" olarak yazmaktan vazgeçerseniz, yanlış bir şey vardır.

Muhtemelen programcı genel mantığı özlüyor, gelecekteki değişikliklerden ve kodu yeniden düzenlemekten korkuyor.

Arayüzün tanımı gerçek bir ihtiyaç; Gerçekten de, basit bir özellik ayarlamanız ve elde etmeniz gerekirse (üyeyi kısaltan çok mantık olmadan) mümkün olacaktır. Ancak, gerçek ihtiyaç farklı bir şekilde analiz edilebiliyorsa, neden daha sezgisel bir arayüz tanımlamıyorsunuz?

Soruyu gerçekten cevaplamak için elbette hayır ve sebep çok açık: İhtiyaç duyduğu şey için yöntem / özellik / ne yöntemi tanımlanmalıdır. Boş bir sanal fonksiyonun bile var olmasının bir nedeni var.


6
"Gelecekten korkuyor ... refactoring" altında bahsettiğiniz erişimci / mutator yöntemleri eklemek için iyi bir neden var. Ama aynı zamanda koda değer katmadığı konusunda haklısın. Boyutu küçülterek (yerel veya küresel olarak) ya da okunabilirliği artırarak. Aklımda, bu hem Java hem de JavaBeans kongresindeki zayıf dil tasarımına değiniyor. Bu, C # 'nin otomatik özellik sözdizimi ile ilgili endişeleri gidermek için dili başarıyla geliştirdiği bir alandır . Bir Java programcısı olarak, temel yapıya benzer sınıflar için ham stilinize katılıyorum .
Anm

1
Getter / setter işlevleri, şu anda yaptıkları tek şey bir değişken okumak veya yazmak olsa bile iyidir. Pratik bir konu olarak, daha sonra alan her değiştiğinde ekrana bir değer yazdırmaya karar verdiğiniz veya bu değerin geçerli olup olmadığını kontrol ettiğiniz bir senaryo hayal edebilirsiniz. (Belki bir kesir için
paydadır ve

2
alıcılar ve belirleyiciler berbat, ancak geçerli kullanımlarına rağmen. Onları kullanmak gerekirse, dilin bir başarısızlığı olduğunu düşünüyorum.
Carson Myers

@Rei: neden harici bir sınıf paydaların değerini kontrol etmeli? Bu, Fraction sınıfının divide () işlevi ile yapılmalı ya da Fraction sınıfı boş paydaları kontrol etmek için bir isDivisible () sağlamalıdır. Alıcılara / ayarlayıcılara ihtiyaç duymak, genellikle sınıfınızın yüksek bağlanma ve / veya düşük uyumluluğa (yani kötü) sahip olduğu bir kod kokusudur.
Yalan Ryan, 19

@ Lie Ne? Paydaları kontrol etmek için harici bir sınıfın kullanılması gerektiğini hiç söylemedim. Dış sınıfın kazara 0 olarak bir payda ayarlayabileceğini söylüyorum. Geçerlilik kontrollerinin yapılmasının amacı, belirleyicilerde tüketici kodunda bulunan hataları daha önce bulunmaya teşvik etmektir. Çağrılabilen veya çağrılmayacak bir isDivisible () işlevi sağlamak da bu amaçla çalışmaz. Ve alıcılara / alıcılara ihtiyaç duymak tam olarak nasıl birleşme olduğunu gösteriyor?
Rei Miyasaka
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.