Zorunlu programcılara deklaratif programlama öğretmeye çalışırken bazı iyi uygulamalar nelerdir?


13

Şirketimde F # 'da biraz eğitim vermeyi teklif ettim ve ilgi gösterdi. Genellikle VB6 ve C # programcılarıdır ve programlamayı çok fazla tutkuyla takip etmezler. İşlevsel bir konuda düşündüğünüzde doğru kodu yazmanın daha kolay olduğunu hissediyorum, bu yüzden kesinlikle bundan faydalanmaları gerekir.

Birisi buna nasıl yaklaşmam gerektiği konusunda tavsiyede bulunabilir mi?

fikirler

  • Sözdizimine odaklanmayın, bunun yerine bu dilin ve desteklediği deyimlerin nasıl kullanılabileceğine odaklanın.
  • Zorunlu bir tarzda yazmak için acı olan ancak bildirimsel bir şekilde yazıldığında zarif koda dönüşen örnekleri deneyin ve düşünün.

F # ve bildirimsel programlama ?????
P

@Pavel - Bu bir soru mu?
ChaosPandion

3
@Pavel - Tamam, neden açıklama yaptığınızı açıklamak ister misiniz? Bu, son derece belirsiz yorumlar yaptınız. Çok kaba.
ChaosPandion

3
tr.wikipedia.org/wiki/Declarative_programming İşlevsel programlama , bir tür bildirimsel programlamadır. Ayrıca +1, güzel soru.
Kendine not -

2
@Chaos, bence F #, bildirimsel programlama paradigmasını desteklemiyor. İstekli değerlendirme ve zorunlu özellikleri, dili, örneğin, C # 'da kullandığınız aynı zorunlu ifadeleri ifade etmenin kullanışlı, işlevsel bir biçimi haline getirir. Haydi, makeF # veya Caml'dan daha bildirimsel bir dil bile var! (İronik olarak, bu işinizi kolaylaştırır.)
P

Yanıtlar:


5

Fonksiyonel programlama benim için garip bir canavar. F # ve Haskell'i öğrendim, birkaç basit program yazdım ve onları kullanmayı sevdim, ancak bazı insanların bahsettiği "vahiy parlaması" olmadı. Ama yavaş yavaş, giderek daha çok değişmez olması gereken kodlar yazdığımı, görevleri daha küçük fonksiyonlara böldüğümü ve delegeleri çok daha fazla kullanmaya çalıştığımı fark ettim. Bu, eğer isterseniz, işinize sürünen bir şey çünkü bu tekniklerin değeri kendiliğinden belirgindir.

Şimdi, daha pratik eğitim için: İki kavramın gerçekten bir stil olarak İşlevsel Programlama'yı tıkladığını görüyorum.

Birincisi, FP stili OOP'ta olduğu gibi kompozisyona değil, verilerin yapısına dayanmaktadır. C-in List gibi bir şey türü güvenli listeleri oluşturmak için akıllı bir hile olarak, diğer tür (liste) tür (dize) oluşan bir şey baktı. FP'yi öğrendikten sonra, şimdi Monads gibi jeneriklere bakıyorum. Liste, kodun alabileceği yapılandırılmış bir formdur ve dizeleri süsler.

İkincisi, ve belki de C # / ASP programcıları için daha yararlıdır, FP'nin özyineleme ve tekrarlama üzerinde çalışırken OOP değişebilirlik ve döngü üzerinde çalışır. Şimdi ASP sayfası yaşam döngüsünü bir tür FP olarak düşünme eğilimindeyim: her istek tüm yaşam döngüsü boyunca sıfırdan işlenir, bu nedenle tüm sayfa aslında büyük bir yavaş yavaş yinelenen programdır. Bu görüşü daraltabilirseniz, zorunlu bir programın veri alan, üzerinde çalışan ve eski verileri değiştirmek yerine yeni veriler veren işlev döngüleri etrafında nasıl yapılandırılabileceği hakkında daha iyi bir fikir edinebilirsiniz.

En azından benim için, bu yaklaşımın üstesinden gelmek için en zor engel, değişebilir nesneleri kullanırken tonlarca kaynağı boşa harcadığınızı hissetmek, bir ton hafıza tasarrufu sağlayacaktır. GC'de güveniyoruz ve programın çalıştığını ve hatta varsa doğrulandığını ve sorunların tam olarak nerede olduğunu görmek için bir profiler kullanmak için gerçekten görene kadar performans endişelerini bırakmayı öğrenmek zorunda kaldım.



1

Birçok zorunlu programlama dili (Ada, C / C ++, Turbo Pascal, FoxPro) çalışma zamanında değerlendirilebilen işlevlere ve yordam adı değişmezlerine (ve çağrılan çağrıldıktan sonra adlandırılan yordamlara) işaretçi tanımlama yeteneğine sahiptir.

Geleneksel örnek C'deki qsort'tur . Veri yapılarında diğer algoritmaları yürüten algoritmaları tanımlayabileceğiniz fikrini geliştirin . Açıkçası bu fonksiyonel programlamanın sadece bir kısmıdır. Ama bunun batma fikrini almak için iyi bir başlangıç ​​noktası olduğunu gördüm.

Bu battığında, başka şeylere dalmaya başlayabilirsiniz (değişmezlik, paylaşım-hiçbir şey, vb.)


Düzeltme: Demek istediğim, DİĞER algoritmaları parametre olarak alabilen ve bunları veri yapılarında çalıştırabilen parametreli algoritmaları tanımlayabileceğiniz fikrine dayanmaktır.
luis.espinal

1

Birisi buna nasıl yaklaşmam gerektiği konusunda tavsiyede bulunabilir mi?

Elbette:

  • Örneklerinizi dikkatlice seçin, böylece F # kodunuz sadece bir sorunu zarif bir şekilde çözmekle kalmaz, aynı zamanda C # / VB ile mümkün olandan çok daha zarif bir şekilde çözer . Desen eşleme ve tür çıkarımı burada arkadaşlarınızdır.

  • F # 'da bulunan yeni özelliğin, örneğin eşzamansız iş akışları, etkin desenler gibi avantajlarını vurgulamak için bir örnek kullanın.

  • Uygun olduğunda değiştirilebilir veri yapıları kullanarak saf örnekler vermekten korkmayın. F # bir sebepten dolayı saf değildir.

  • F # 'ı her derde deva olarak sunma. F # için uygun olmayan uygulamaları ve diğer .NET dillerinden çok daha uygun olan uygulamaları açıklayın.

  • Oyuncak örneklerinin yanı sıra F # (Bing AdCenter, Halo 3 vb.) Kullanan başarılı gerçek dünya projelerini inceleyebilirler.

  • Her şeyi F # 'ın problemleri daha kolay çözmelerine nasıl yardımcı olabileceği açısından açıklayın. Dini tartışmalardan kaçının. F # hakkında olumlu, diğer diller hakkında olumsuz değil. Onları gerçeklerle ve kanıtlarla donatın, ancak kendi sonuçlarını çıkarmalarına izin verin.

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.