İş yazılımında lambda function \ method kullanılması kabul edilebilir mi?


26

Delegelerin \ lambda işlevlerinin orta fikirdeki deliği çok fazla tekrarlamadan çözmek için kullandığını gösteren yayınlar gördüm: http://www.markhneedham.com/blog/2009/04/04/functional-c -the delikli-in-the-orta desen /

Sorun, küçük geliştiricilerin ve diğerlerinin mutlaka işlev göstergesinin \ delegate \ lambda işlev kavramının ne olduğunu anlamaması, kod okumayı (ve muhtemelen hata ayıklamayı) daha zor hale getirdiği anlaşılıyor.

Bu yazılımın, özellikle küçük ekip veya tek geliştirici mağazalarında, ticari yazılım yazarken kullanımını engellemeli mi veya ciddi şekilde sınırlamalı mıyız?

Yoksa uygun yorumlarla kullanmak kabul edilebilir mi ve artık etrafta olmadığımda bir sonraki geliştiricinin lambda işlevlerini anlamasını veya öğrenmesini beklemek?


10
Ruby'de, lambdalar (kendileri ve bloklar şeklinde) temel bir dil kavramıdır. ArraySınıftan karmaşık ORM'lere kadar her yerde kullanılırlar . Kimse şikayeti yok.
whitequark

18
Bunu bir cevaptan çok bir yorum olarak gönderiyorum çünkü bu, diğerlerinin zaten söylediklerinin bir varyasyonu: Devam edip onları kullanırdım. Çoğu insanın söylediğinin aksine, dürüstçe basit bir dil özelliği kullandığınızı açıklamak için her yere yorum eklemekle uğraşmazdım. Yorumlar, iş mantığını ve uygulama tercihlerinin neden yapıldığını açıklamalı, geliştiricileri zaten aşina oldukları dil özellikleri hakkında eğitmemelidir. Küçük devlerinizin lambdaları anlamadığını biliyorsanız, onları oturun ve konsepti açıklayın.
Mitch Lindgren

3
Bir Junior kodlayıcı lambda kullanmak istiyorsa ama eski C ++ bilgisayar korsanlarının bunu almayacağından endişeleniyorsa? İş dünyasında ne lambda ne de ne algoritmalar kullanılmalı.
İş

10
Bu tutum için olsaydı, iki tek renkli monitörü ovalayarak hala ateş yakardık.
sbi

3
Fonksiyonlara iyi işaretçiler, üniversite C derslerinde düşünülmektedir. Ayrıca C # 'da delegeleriniz var, bu yüzden neredeyse her geliştirici veri türü / parametresi olarak işlevler konusunda oldukça rahat olmalıdır. En iyi yazabildiğiniz kodu yazın.
Daniel Iankov

Yanıtlar:


23

Sorun, küçük geliştiricilerin ve diğerlerinin işlev göstergesinin \ delegate \ lambda function kavramının ne olduğunu anlamaması gibi görünüyor.

Açıkçası, bu onların problemi. Bunun için eğitim aldıklarından emin ol. İyi bir teknik kullanamazsınız çünkü bazı insanlar bunu anlayamayabilir. Yardıma ihtiyaçları olursa, yazara sorabilirler. Daha da önemlisi, lambda fonksiyonları son derece yaygın dil özellikleri haline geliyor.

Kalıtım kullanmamalı mıyız, çünkü bazı insanlar anlamıyor mu? Cehennem, bazı insanlar bilime veya mikroplara ya da saçma şeylere inanmayı reddediyorlar. Devam edebilmelisiniz ve başkalarının size yetişemeyeceği ihtimaline izin vermemeniz gerekir, yapabileceğiniz en iyi kodu yazmanızı engelleyebilirsiniz. Lambda fonksiyonları harika bir özelliktir ve kod yazmada büyük yardım sağlar ve alabileceğiniz tüm yardımları almalısınız.

Bir geliştirici, içinde bulunduğu dili nasıl kullanacağını bilmeli. Olmazlarsa, o zaman onları kovun ve yapan birini bulun ya da eğitsinler, öyle olsunlar.


11
Şey,
lambdayları

49

Evet, onları kullan.

Ben küçük bir geliştiriciyim ve lambdaları (ve bahsettiğiniz diğer kavramları) biliyorum / anlıyorum. Küçük bir geliştiricinin tüm bu kavramları çok kısa sürede öğrenmesini engelleyebileceğim hiçbir şey yok. Gençler, birçok yazılım geliştirme yöntemine gelince, aynı miktarda deneyime / uzmanlığa sahip olmayabilir, ancak, lambda gibi kavramlar, programlama ve internet bağlantısı hakkında temel bir anlayışa sahip olan herkes tarafından kolayca anlaşılabilir. Ayrıca, örneğin C # kullanıyorsanız, lambdaları seçmiş olmanız garip görünüyor, C # kullanıyorsanız, muhtemelen küçük geliştiricilerin üzerine lambda öğrenmeye başlayacak kadar bir aklınız bile yok (muhtemelen ben 2008'de tanıtıldıysam, doğru hatırla).

Kısacası, biz sizin neofit'ler için kodunuzu düşürmenize gerek yok. Biz gayet iyi olacağız ve gerçekten bulabileceğiniz en iyi uygulama üzerinde çalışmayı tercih edeceğiz. :)


4
Biz olmadıkça, neofitleri yavaştır. Bu durumda, lütfen kodu bizim için boşaltın veya bizi ilk başta işe almayın.
İş

19
@Job - Bence sadece dürüst olmalıyız ve bir çocuk birkaç gün verilen (oldukça cömert) lambda sözdizimini anlayamıyorsa, bunun gerçekten işe alım sorunu olabileceğini söylemek zorundayız.
Morgan Herlocker

2
Neofitleri, stackoverflow.com/questions/2167360/… 'e yönlendirin ... bu, o zamanki sorumun mükemmel bir cevabıydı ve sıçrama tahtasıdaki Linq ve lambdaları anlamamı sağladı.
IA,

20

Sorununuz için makul bir çözüm ise, onları kullanmalısınız.

Yapay olarak kendinizi kısıtlamayın - bakımı zor olan düşük kaliteli kodla bitme olasılığınız daha yüksektir.

Eğer kod uygun yorumlarla iyi yazılmışsa, aşağıdakileri sizden öğrenebilmelisiniz .


13

Msdn belgelerine bağlantıyı kullanan ve kullandığı bloğun tepesindeki yorumlara devam edin. Bilmedikleri şeyleri öğrenmek için geliştirici işinin bir parçası olan yeni / karmaşık teknolojiyi kullanmaktan korkmamalısınız.


14
bir bağlantı gerçekten gerekli mi?
Morgan Herlocker

3
Her lambda kullanırken gerçekten bir link koyar mısın?
Federico klez Culloca

karmaşıklık düşmandır ...
Robert S Ciaccio

11

Sorun, küçük geliştiricilerin ve diğerlerinin işlev göstergesinin \ delegate \ lambda function kavramının ne olduğunu anlamaması gibi görünüyor.

O zaman onları öğrenmeleri gerekir. Dönemi.

  1. Bu C # ezoterik bir köşe değil . Birçok .NET kütüphanesinden yararlanmak için onları anlamalısınız.
  2. Bu genel olarak ezoterik bir dil konusu değildir. Neredeyse popüler kullanımdaki her dilin bugün bazı fonksiyon göstergeleri vardır ve çoğu Java kullanmaktadır (ya da Java ve C ++ durumunda).

Onlara açıklamak için birkaç dakikanızı ayırın. Zor değil.


5

İş için doğru aracı kullanmalısınız. Eldeki sorunu çözmek için daha basit ve daha net bir yol varsa, bunu kullanın. Gelecekteki bakımcılar için ileri düzeyde bir konu olabileceğini düşündüğünüz bir şeye girmeniz gerekiyorsa, açık bir şekilde işaretleyin ve tekniği açıklayan belgelere bir işaretçi ekleyin.

işlev gösterici \ delegate \ lambda function concept

Bunların üç farklı şey olduğu not edilmelidir.


3

İki olası senaryo:

a) Meslektaşlarınız (veya çoğu) makul derecede yeteneklidir. Onlar lambda öğrenmeye ihtiyaç duyuyorlar, dilin bir parçasılar ve bazen iş için tam olarak doğru araç oluyorlar. Bu yüzden, gerçekten de en iyi araç olduklarında, elbette, onları kullanın. Onları kullanmaktan kaçının çünkü sadece kendiniz hakkında bilgi edindiniz ve hepiniz heyecanlandınız ve onların gümüş bir mermi olduğunu düşünüyorsunuz.

b) Siz meslektaşlarınız (veya çoğu) yetersiz. Onların lambdaları, kapakları, fonksiyon göstergelerini veya diğer benzer meta kodlama kavramlarını tam olarak anlamalarına imkan yok. Muhtemelen zaten işaretçileri, referansları ve özyinelemeyi anlamakta zorlanıyorlar. Bu durumda, yapabileceğiniz en iyi şey kurşunu ısırmak, sakar, ayrıntılı, lambda içermeyen bir çözelti kullanmak ve CV'nizi tazelemek, çünkü iş avcılığı yapmalısınız.


2

Bu tutarlılık çok yardımcı olabilir. Tutarlı olarak aynı stille vb. Kullanırsanız, okuyucular sadece bir kez öğrenmek zorunda kalırlar ve sonra her yerde tanırlar.

Ayrıca, en azından ilk başta açık olmanıza yardımcı olabilir. Örneğin, bu ikisi eşdeğerdir:

doSomething(() => someMethod());

doSomething(someMethod);

private void doSomething(Action someAction) { ... }
private void someMethod() { ... }

... ama ilk durumda, açık, eğer lambda sözdizimini biliyorsanız, ne yapıyoruz. Lambda sözdizimini bilmiyor olsanız bile, yeni bir şey gördüğünüz ve onu araştırmanız gerektiği açıktır. İkinci durumda, bir değişkeni geçiyor gibisin.

ReSharper'ın seni ikinci davaya zorladığını biliyorum, ama bunun her zaman iyi bir fikir olup olmadığını merak ediyorum. İkinci durumda, bunu bilmek zorunda doSomethingbir sürer Action.


1
İkincisi kullanırdım, bazı Metod'ların iletildiğini ve bazı Metod'ların ne olduğunu belirlemek için sağ tıklayıp def'n'e giderim. bunun bir işlev / yöntem olduğunu ve bu noktada herhangi bir programcıya mantıklı geldiğini görün.
CaffGeek

@Chad - "Okuyucunun bilmesi daha az muhtemel olan daha kısa bir kelime kullanırdım ve bir Kindle üzerinde okuduğunu varsayarım, bu yüzden kelimeye kadar imleç göstermeleri gerekir," onlar için sözlükte, daha uzun ve daha açıklayıcı bir kelime kullanmak yerine, bildiklerinden eminim. Ve Kindles olmayan insanları mahvet. " Bu mantığa katılmıyorum. Kod yazılmışdan daha okunur.
Scott Whitlock

"İkinci durumda, bunu bilmek zorunda doSomethingbir sürer Action." Ve nasıl sahip olmaktan daha farklı olduğunu bilmek olduğunu functionWithNameThatDoesNotSpecifyItsArgumentTypesbir sürer ObjectOfSomeType? Aslında, işlevlerin gerçek birinci sınıf nesneler olduğu dillerde, hiç de farklı değil.
JAB

1

Genellikle bazı kavramları anlamak zor buluyorum çünkü bunlar pratikte, gerçek yaşamda karşılaşmak yerine sadece soyutta tanımlanıyor. Bu yüzden şahsen bu tür yapılarla karşılaşmaktan yana olacağım.

Bunu yapmaktan kaçınmak için düşünebildiğim ana senaryo, programlama diğer kişinin ana görevi değilse. Örneğin, zamanlarının çoğunu gerçek deneyler yaparak geçiren bir sistem yöneticisi veya bir biyoinformatik uzmanı ("laboratuar faresi").


1
itemsList.ForEach(item => DoAction(item));
...
public void DoAction(Item item) {
  //...do various things here...
}

Şimdi, belki burada DoAction diyoruz çünkü vücudu lambdaya sığmayacak kadar uzun. Bu durumda, ForEach () extension yöntemini List'e kullanmak bize normal foreach döngüsünü kullanmaktan çok fazla fayda sağlamıyor, sanırım bir kaç satır kod kaydetse bile, sanırım. Ancak, bu özel durumda, ForEach () kullanmak bizi gerçekten daha fazla kod alan ve yığında gereğinden fazla ekstra parçalamaya neden olan bir şey yapmamıza izin vermedi; Geçen Bağımsız Değişimin Lambda Olmasına Gerek Yok

DoAction'ı şu şekilde çağırmanız gerekir:

itemsList.ForEach(DoAction);

Hiç Lambda yok. Anahtar, bir lambda ifadesi oluşturduğunuzda gerçekte ne geçtiğinizi hatırlamaktır: bir temsilci örneği tanımlamak için bir kısayol. Evet, ayrıca kapanma gibi faydaları da var, ancak yöntem çağrısının beklediği şeyin yerini kaybetmemesi gerekiyor. Bu durumda, Eylem imzasına uyan bir yönteme yönelik bir adres beklemektedir. DoAction zaten böyle bir yöntemdir, bu nedenle lambda oluşturmak tamamen gereksiz bir yöntem çağrısına eklemektir.


-1

IMHO, ekibin teknik seviyesinden daha yüksek herhangi bir teknik seviyede yazı yazıyor, yanlış. Ekip üyeleriniz lambda ifadeleri ve işlevleriyle gerçekten rahat değillerse ve bunu öğrenmek için zamanları yoksa (zamanlarını performans ayarlama veritabanında geçirmeli, kullanıcı arayüzü üzerinde daha fazla çalışmalı, bileşenler oluşturmalı vb.), O zaman şiddetle onları kullanmamayı öner . Bununla birlikte, boş zamanlarını öğrenmek ve boş zamanları almak istiyorlarsa veya bilgiyi zaten biliyorlarsa neden olmasın?

Bunun takım ve takımın teknik seviyesine göre değerlendirilmesi gereken göreceli bir konu olduğunu düşünüyorum. Ve bu sadece lambda fonksiyonlarında geçerli değildir. Bu teknik bilgi durumudur. Bu nedenle, örneğin ne zaman bir takım depo kalıbı hakkında bir şey biliyorsa, onu uygulamak ve sürdürmek için uzmanlığa sahipse, yapalım. Ama eğer yapmazlarsa, başka bir yol bul. Eğer OO JavaScript'i biliyorlarsa, JavaScript’te daha fazla ölçeklenebilir kod oluşturalım. Ama yapmazlarsa, sadece işlemsel JavaScript'e geri 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.