"ปัญหาการแปล" ที่ใหญ่ที่สุดน่าจะเกิดจากระเบียบวิธี Java / OOP ไปสู่กระบวนทัศน์การเขียนโปรแกรม Clojure / functional
โดยเฉพาะอย่างยิ่งแทนที่จะมีสถานะที่เปลี่ยนแปลงไม่ได้ภายในวัตถุ "Clojure way" คือการแยกสถานะที่เปลี่ยนแปลงไม่ได้ออกจากกันอย่างชัดเจนและพัฒนาฟังก์ชันบริสุทธิ์ (ปราศจากผลข้างเคียง) คุณคงรู้ทั้งหมดนี้แล้ว :-)
อย่างไรก็ตามปรัชญานี้มีแนวโน้มที่จะนำไปสู่รูปแบบการพัฒนาแบบ "จากล่างขึ้นบน" ซึ่งคุณจะมุ่งเน้นไปที่ความพยายามครั้งแรกในการสร้างชุดเครื่องมือที่เหมาะสมเพื่อแก้ปัญหาของคุณจากนั้นจึงต่อเข้าด้วยกันในตอนท้าย หน้าตาอาจจะประมาณนี้
ระบุโครงสร้างข้อมูลหลักและแปลงเป็นแผนที่ Clojure ที่ไม่เปลี่ยนรูปหรือข้อกำหนดของบันทึก อย่ากลัวที่จะซ้อนแผนที่ที่ไม่เปลี่ยนรูปจำนวนมาก - มันมีประสิทธิภาพมากเนื่องจากโครงสร้างข้อมูลถาวรของ Clojure ควรค่าแก่การดูวิดีโอนี้เพื่อเรียนรู้เพิ่มเติม
พัฒนาไลบรารีขนาดเล็กของฟังก์ชันเชิงตรรกะทางธุรกิจที่บริสุทธิ์ซึ่งทำงานบนโครงสร้างที่ไม่เปลี่ยนรูปเหล่านี้ (เช่น "เพิ่มสินค้าลงในตะกร้าสินค้า") คุณไม่จำเป็นต้องทำสิ่งเหล่านี้ทั้งหมดในครั้งเดียวเนื่องจากสามารถเพิ่มเพิ่มเติมในภายหลังได้ง่าย แต่จะช่วยได้ในช่วงต้นเพื่ออำนวยความสะดวกในการทดสอบและพิสูจน์ว่าโครงสร้างข้อมูลของคุณใช้งานได้ ..... ไม่ว่าจะด้วยวิธีใดก็ตาม ชี้ให้เห็นว่าคุณสามารถเริ่มเขียนสิ่งที่มีประโยชน์แบบโต้ตอบได้ที่ REPL
แยกการพัฒนารูทีนการเข้าถึงข้อมูลที่สามารถคงโครงสร้างเหล่านี้ไปยัง / จากฐานข้อมูลหรือเครือข่ายหรือโค้ด Java เดิมได้ตามต้องการ เหตุผลที่ต้องแยกสิ่งนี้ออกจากกันคือคุณไม่ต้องการให้ตรรกะการคงอยู่ที่เชื่อมโยงกับฟังก์ชัน "ตรรกะทางธุรกิจ" ของคุณ คุณอาจต้องการดูClojureQLสำหรับสิ่งนี้แม้ว่าจะค่อนข้างง่ายในการตัดโค้ดการคงอยู่ของ Java ที่คุณชอบ
เขียนการทดสอบหน่วย (เช่นด้วยclojure.test ) ที่ครอบคลุมทั้งหมดข้างต้น นี่เป็นสิ่งสำคัญอย่างยิ่งในภาษาไดนามิกเช่น Clojure เนื่องจาก a) คุณไม่มีตาข่ายนิรภัยมากนักจากการตรวจสอบประเภทคงที่และ b) ช่วยให้แน่ใจว่าโครงสร้างระดับล่างของคุณทำงานได้ดีก่อนที่คุณจะสร้างมากเกินไป ด้านบนของพวกเขา
ตัดสินใจว่าคุณต้องการใช้ประเภทการอ้างอิงของ Clojure อย่างไร (vars, refs, agent และ atoms) เพื่อจัดการสถานะระดับแอ็พพลิเคชันที่ไม่แน่นอนแต่ละส่วน พวกเขาทั้งหมดทำงานในลักษณะเดียวกัน แต่มีความหมายของธุรกรรม / การทำงานพร้อมกันที่แตกต่างกันขึ้นอยู่กับสิ่งที่คุณกำลังพยายามทำ Refs น่าจะเป็นตัวเลือกเริ่มต้นของคุณ - อนุญาตให้คุณใช้พฤติกรรมการทำธุรกรรม STM "ปกติ" โดยการตัดโค้ดใด ๆ ในบล็อก (dosync ... )
เลือกเว็บเฟรมเวิร์กโดยรวมที่ถูกต้อง - Clojure มีค่อนข้างน้อยอยู่แล้ว แต่ฉันขอแนะนำให้ Ring - ดูวิดีโอ " One Ring To Bind Them " ที่ยอดเยี่ยมนี้พร้อมทั้งFleetหรือEnliveหรือHiccupขึ้นอยู่กับปรัชญาการทำเทมเพลตของคุณ จากนั้นใช้สิ่งนี้เพื่อเขียนเลเยอร์การนำเสนอของคุณ (โดยมีฟังก์ชันเช่น "แปลตะกร้าสินค้านี้เป็นส่วน HTML ที่เหมาะสม")
สุดท้ายเขียนใบสมัครของคุณโดยใช้เครื่องมือข้างต้น หากคุณทำตามขั้นตอนข้างต้นอย่างถูกต้องแล้วนี่จะเป็นเรื่องง่ายเพราะคุณจะสามารถสร้างแอปพลิเคชันทั้งหมดได้ด้วยองค์ประกอบที่เหมาะสมของส่วนประกอบต่างๆโดยมีแผ่นสำเร็จรูปน้อยมาก
นี่เป็นลำดับคร่าวๆที่ฉันจะโจมตีปัญหาเนื่องจากมันแสดงถึงลำดับการอ้างอิงในโค้ดของคุณอย่างกว้าง ๆ และด้วยเหตุนี้จึงเหมาะสำหรับความพยายามในการพัฒนา "จากล่างขึ้นบน" แม้ว่าจะอยู่ในรูปแบบว่องไว / ทำซ้ำที่ดี แต่คุณอาจพบว่าตัวเองผลักดันไปข้างหน้า แต่เนิ่นๆเพื่อไปสู่ผลิตภัณฑ์ขั้นสุดท้ายที่พิสูจน์ได้จากนั้นจึงกระโดดกลับไปที่ขั้นตอนก่อนหน้านี้ค่อนข้างบ่อยเพื่อขยายฟังก์ชันการทำงานหรือตัวปรับแต่งตามต้องการ
ps ถ้าคุณทำตามวิธีการข้างต้นฉันจะติดใจที่ได้ยินว่า Clojure ต้องใช้กี่บรรทัดเพื่อให้ตรงกับฟังก์ชันของ Java 50,000 บรรทัด
อัปเดต : เนื่องจากเดิมทีโพสต์นี้เขียนขึ้นมีเครื่องมือ / ไลบรารีพิเศษสองสามรายการที่อยู่ในหมวดหมู่ "ต้องตรวจสอบ":
- นัวร์ - เว็บเฟรมเวิร์กที่สร้างขึ้นบน Ring
- Korma - DSL ที่ดีมากสำหรับการเข้าถึงฐานข้อมูล SQL