เรามี codebase JavaScript ที่ค่อนข้างใหญ่และประมาณหนึ่งเดือนที่ผ่านมาเราพยายามที่จะให้ CoffeeScript ได้ลองใช้ หนึ่งในนักพัฒนาของเราเริ่มต้นด้วยการโยกย้ายหนึ่งในโมดูลของเราจาก JS การบริการลูกค้าโดยใช้http://js2coffee.org/ เครื่องมือนี้ค่อนข้างมีประโยชน์และใช้เวลาประมาณสองหรือสามชั่วโมงในการพอร์ตจาวาสคริปต์ 1,000 บรรทัด ข้อสังเกตบางอย่างที่เราสังเกตเห็น ณ จุดนั้น:
รหัส CoffeeScript ที่ได้นั้นค่อนข้างอ่านได้
เรารวบรวมมันกลับไปที่จาวาสคริปต์และมันค่อนข้างง่ายต่อการนำทางและการดีบัก ในขณะที่เราทำการพอร์ตโมดูลนั้นผู้พัฒนารายอื่นจากทีมของเราพบข้อผิดพลาด นักพัฒนาสองคนนี้แก้ไขข้อผิดพลาดนั้นในรหัส JavaScript เก่าของเราและในรหัส JavaScript ใหม่ที่ออกมาจากคอมไพเลอร์ CS พวกเขาทำงานอย่างอิสระและใช้เวลาประมาณ 15-20 นาที
เนื่องจากความจริงที่ว่ามันเป็นพอร์ตรหัสผลลัพธ์จึงไม่ได้ใช้คุณสมบัติเฉพาะของกาแฟที่เหมาะสมหรือเป็นที่ต้องการ ถ้าเราจะเขียนใน CoffeeScript ตั้งแต่เริ่มต้นรหัสจะเป็นสำนวนมากขึ้น เพราะหลังจากนั้นเราจึงตัดสินใจว่าเราจะไม่ย้ายรหัสที่มีอยู่
โดยทั่วไปความสามารถในการอ่านฟังก์ชั่นที่สั้นลงและวัตถุขนาดเล็กจะเพิ่มขึ้นในบางส่วนของการขยาย อย่างไรก็ตามสำหรับวิธีการที่ยาวกว่านั้นไม่ใช่ในทุกกรณี การขยายตัวที่ใหญ่ที่สุดมาจาก->
และชัดเจนreturn
แต่นอกเหนือจากที่รหัสของเราไม่ได้สั้นลงหรือง่ายขึ้นมาก บางส่วนของไวยากรณ์ดูเหมือนสับสนโดยเฉพาะอย่างยิ่งตัวอักษรวัตถุ CS ละเว้นเครื่องหมายปีกการอบคำจำกัดความของสมาชิกและรวมกับ"ทุกอย่างเป็น is-an-expression"และโดยปริยายreturn
ซึ่งทำให้โค้ดบางส่วนอ่านยาก
นี่คือ JavaScript:
var rabbitGenerator = {
makeRabbit: function(rabbitName, growCarrots) {
if (growCarrots) {
carrots.growMore(10);
} else {
carrots.ensureSupply();
}
return {
name: rabbitName,
height: 0,
actions: {
jump: function (height) {
this.height += height;
},
eatCarrot: function () {
// etc
}
}
};
},
// more members
}
และนี่คือลักษณะของโค้ด CoffeeScript ที่เกี่ยวข้อง:
rabbitGenerator =
makeRabbit: (rabbitName, growCarrots) ->
if growCarrots
carrots.growMore 10
else
carrots.ensureSupply()
name: rabbitName // (*)
height: 0
actions:
jump: (height) ->
@height += height
eatCarrot: ->
เนื่องจากขณะนี้มันค่อนข้างยากที่จะเข้าใจว่าคำสั่ง return เริ่มต้นที่(*)
บรรทัด ในโครงการของเราเราพึ่งพาตัวอักษรของวัตถุเป็นอย่างมาก: เราส่งผ่านเป็นพารามิเตอร์ฟังก์ชันและส่งคืนจากฟังก์ชันอื่น ในหลายกรณีวัตถุเหล่านี้มีแนวโน้มที่จะค่อนข้างซับซ้อน: สมาชิกประเภทต่าง ๆ และหลายระดับรัง ในกรณีของเราความรู้สึกโดยรวมคือรหัส CoffeeScript อ่านได้ยากกว่าโค้ด JavaScript ธรรมดา
แม้ว่าการแก้ไขข้อบกพร่อง CoffeeScript จะกลายเป็นเรื่องง่ายกว่าที่เราคาดไว้ประสบการณ์การแก้ไขจะลดลงเล็กน้อย เราไม่พบโปรแกรมแก้ไข / IDE ที่ดีสำหรับภาษานี้ เราไม่ได้สร้างมาตรฐานให้กับ editor / IDE สำหรับรหัสฝั่งไคลเอ็นต์สำหรับโครงการของเราและในความเป็นจริงเราทุกคนใช้เครื่องมือที่แตกต่างกัน ในความเป็นจริงทุกคนในทีมตกลงว่าเมื่อพวกเขาเปลี่ยนมาใช้ CoffeeScript พวกเขาจะได้รับการสนับสนุนจากเครื่องมือของพวกเขาค่อนข้างแย่ ปลั๊กอิน IDE และโปรแกรมแก้ไขอยู่ในช่วงเริ่มต้นและในบางกรณีพวกเขาไม่สามารถให้การเน้นไวยากรณ์ที่เหมาะสมหรือการสนับสนุนการเยื้อง ไม่ได้พูดถึงตัวอย่างโค้ดหรือการปรับโครงสร้างใหม่ เราใช้ WebStorm, Eclipse, NetBeans, VisualStudio, Notepad ++ และ SublimeText2
การพูดถึงเครื่องมือฉันควรพูดถึงว่าตัวรวบรวม CoffeScript นั้นมาพร้อมกับแพ็คเกจ Node JS เราเป็นร้าน Java / .NET เป็นหลักดังนั้นทุกคนจึงพัฒนาบนกล่อง Windows จนกระทั่งเมื่อเร็ว ๆ นี้การรองรับ Windows เกือบจะไม่มีอยู่ใน Node เราไม่สามารถทำให้คอมไพเลอร์ CoffeeScript ทำงานบน Windows ดังนั้นในขณะนี้เราตัดสินใจติด<script type="text/coffeescript">
แท็กและคอมไพเลอร์ on-the-fly บนเบราว์เซอร์
คอมไพเลอร์ค่อนข้างเร็วและไม่เพิ่มเวลาเริ่มต้นมากนัก ข้อเสียคือ JavaScript ที่ได้รับจะมีการeval
แก้ไขและเป็นการยากที่จะวางเบรกพอยต์ไว้ในเครื่องมือสำหรับนักพัฒนาของเบราว์เซอร์ (โดยเฉพาะอย่างยิ่งใน IE8) หากเรามีปัญหาในการดีบักเราจะรวบรวมโค้ด CoffeeScript ล่วงหน้าด้วยเครื่องมือการย้ายข้อมูลเดียวกันกับที่ฉันได้กล่าวไว้ข้างต้น แต่นั่นก็ยังไม่สะดวก
คำสัญญาอื่น ๆ ของ CoffeeScript เช่นการvar
แทรกอัตโนมัติหรือการจัดการแบบกึ่งโปร่งใสของthis
ตัวดำเนินการลูกศรไขมัน ( =>
) กลับกลายเป็นว่าไม่ให้ผลกำไรมากเท่าที่เราคาดหวัง เราใช้ JSLint เป็นส่วนหนึ่งของกระบวนการสร้างของเราแล้วและเราเขียนโค้ดในES3 x ES5-Strict
ส่วนย่อยของภาษา อย่างไรก็ตามความจริงที่ว่ากาแฟผลิตชนิดเดียวกันของ"สะอาด"รหัสเป็นสิ่งที่ดี ฉันหวังว่าทุกเฟรมเวิร์กฝั่งเซิร์ฟเวอร์จะสร้างมาร์กอัป HTML5 และ CSS3 ที่ถูกต้องเช่นกัน!
ที่กล่าวว่าฉันจะไม่บอกว่า CoffeeScript ประหยัดเวลาได้มากโดยการใส่var
คำหลักให้ฉัน var
JSLint ติดอยู่หายไปและแก้ไขได้ง่าย ยิ่งกว่านั้นเมื่อคุณได้รับการแก้ไขโดยบางครั้งคุณก็เริ่มเขียนJavaScript ที่ดีโดยอัตโนมัติอยู่ดี ดังนั้นฉันจะไม่พูดกาแฟเป็นจริงที่เป็นประโยชน์ในเรื่องนี้
เราประเมิน CoffeeScript ประมาณหนึ่งสัปดาห์ สมาชิกในทีมทุกคนเขียนโค้ดไว้และเราแบ่งปันประสบการณ์ของเรากับแต่ละคน เราเขียนโค้ดใหม่และเขียนรหัสที่มีอยู่เมื่อเราเห็นว่าเหมาะสม ความรู้สึกของเราเกี่ยวกับภาษาถูกผสม
โดยทั่วไปฉันจะบอกว่ามันไม่ได้เร่งการพัฒนาของเรา แต่มันก็ไม่ได้ทำให้เราช้าลงเช่นกัน ความเร็วเพิ่มขึ้นเนื่องจากการพิมพ์น้อยลงและพื้นผิวข้อผิดพลาดน้อยลงถูกชดเชยด้วยการชะลอตัวในพื้นที่อื่น ๆ ส่วนใหญ่สนับสนุนเครื่องมือ หลังจากหนึ่งสัปดาห์เราตัดสินใจว่าเราจะไม่บังคับใช้ CoffeeScript แต่เราจะไม่ห้ามมันเช่นกัน ได้รับตัวเลือกฟรีในทางปฏิบัติไม่มีใครใช้มันอย่างน้อยก็ในตอนนี้ บางครั้งฉันคิดว่าการสร้างต้นแบบคุณลักษณะใหม่ในนั้นแล้วแปลงรหัสเป็น JavaScript ก่อนที่จะรวมกับส่วนที่เหลือของโครงการเพื่อให้เริ่มต้นได้เร็วขึ้น แต่ฉันยังไม่ได้ลองวิธีดังกล่าว