คุณเห็นการใช้งานสำหรับ“ การเขียนโปรแกรมสเปรดชีต” หรือไม่? [ปิด]


11

เมื่อไม่นานมานี้ฉันสะดุดกับแนวคิดการใช้สเปรดชีต (ฉันหมายถึงเซลล์และสูตรที่ไม่ใช่รหัสมาโคร) เป็นวิธีการระบุตรรกะการเขียนโปรแกรม ความคิดคือ:

  • สร้างสเปรดชีตที่มีโฟลว์การคำนวณที่กำหนดไว้อย่างชัดเจน (ซึ่งบางครั้งก็เหมาะกับกระบวนทัศน์ "dataflow" ของสเปรดชีตแทนที่จะเป็นรูปแบบการเขียนโปรแกรมเชิงวัตถุหรือเชิงกระบวนวิธี)

  • กำหนดเซลล์อินพุต

  • กำหนดเซลล์เอาท์พุท

  • รวบรวมสิ่งทั้งหมดเป็นคลาสที่ปฏิบัติการได้แบบสแตนด์อโลน (หรือฟังก์ชัน, โพรซีเดอร์, ... )

  • ใช้ในรหัสปกติภายในโครงการซอฟต์แวร์ที่กว้างขึ้น

  • ใช้สเปรดชีตเป็นซอร์สโค้ดที่จะคงอยู่ตลอดเวลา

แนวคิดคือการใช้เทคนิคนี้สำหรับปัญหาที่พอดีกับตัวแบบจริง ๆ และสิ่งนี้จะนำไปสู่รหัสที่มีเอกสารที่เป็นธรรมชาติและบำรุงรักษาง่าย ฉันสนใจที่จะรู้ว่าคุณมีประสบการณ์ในการใช้เทคนิคนี้หรือไม่และเพื่ออะไร แอปพลิเคชันตัวอย่างที่อยู่ในใจของฉันคือเครื่องคำนวณภาษีประกันภัยซึ่งโดยทั่วไปจะร่างสร้างและตรวจสอบโดยนักคณิตศาสตร์บนแผ่นงาน Excel และรหัสต่อมาเท่านั้น (เป็นกระบวนการที่เจ็บปวด) ในตรรกะการเขียนโปรแกรมที่ยากต่อการบำรุงรักษา


ฉันไม่มีความสุขที่ปิดคำถามนี้ ตกลงไม่มีคำตอบเช่น "ใช่" หรือ "ไม่" หรือ "str_replace ()" แต่มันเริ่มต้นการสนทนาที่น่าสนใจ ที่นี่เราไป: meta.programmers.stackexchange.com/questions/5652/ …
ern0

@ ern0 คุณตรวจสอบหน้าทัวร์แล้วหรือยัง "โปรแกรมเมอร์คือทั้งหมดที่เกี่ยวกับการรับคำตอบมันไม่ใช่กระดานสนทนา ... "
gnat

คำตอบ:


5

แม้ว่ามันจะไม่ใช่สไตล์ของ "สร้างสเปรดชีต แต่ก็รวบรวมเป็นรหัส" ที่คุณถามเกี่ยวกับCells dataflow extension เพื่อ CLOSใช้โมเดลที่คล้ายกัน: สูตรที่แสดงการไหลของข้อมูลและการแปลงเป็น "แหล่งวัสดุ" / " ของบันทึก "สำหรับการออกแบบวัตถุ / คลาส พิจารณาว่าเป็นอีกทางเลือกหนึ่งในการสร้างสิ่งที่คุณถาม

และเพื่อความสนุกสนาน: มาโครสเปรดชีต


1
ฉันแน่ใจว่านี่ไม่ใช่สิ่งที่ OP คิดไว้
zzzzBov

4
@zzzzBov ถึงแม้ว่ามันจะเข้ากันได้ดีกับคำอธิบายของ OP
SK-logic

3

ซึ่งบางครั้งเหมาะสมกว่ากระบวนทัศน์ "dataflow" ของสเปรดชีตแทนรูปแบบการเขียนโปรแกรมเชิงโพรซีเดอร์หรือเชิงวัตถุ

จริงๆแล้วฉันแทบจะนึกถึงการคำนวณใด ๆ ในโลกแห่งความเป็นจริงไม่ได้ การเขียนโปรแกรม "Dataflow" สามารถทำได้อย่างง่ายดายภาษาการเขียนโปรแกรมที่ทันสมัยจำนวนมาก (ดูที่ LINQ ใน. NET โลกหรือผู้ดำเนินการประมวลผลรายการของ Perl และ Python) และจากประสบการณ์ของฉันที่ส่งผลให้รหัสบำรุงรักษามากขึ้นกว่าพวง ของ "สูตรสเปรดชีต" พร้อมการอ้างอิงเซลล์ที่ยากต่อการบำรุงรักษา

ในทางกลับกันฉันและเพื่อนร่วมงานของฉันได้สร้างแอปพลิเคชั่นจำนวนมากที่ใช้สเปรดชีต (MS-Excel เพื่อความแม่นยำ) ซึ่ง Excel ถูกใช้เป็นเครื่องมือที่ใช้งานง่ายสำหรับการป้อนข้อมูลอินพุต / สร้างมาสก์อินพุตอย่างรวดเร็วหรือ สำหรับการสร้างผลลัพธ์ที่จัดรูปแบบหรือทั้งสองอย่าง ในทุกกรณีการคำนวณหรือการประมวลผลข้อมูลนั้นไม่ได้ทำ (หรือเพียงบางส่วนเท่านั้น) โดยสูตร Excel แต่ตามรหัสโปรแกรมเนื่องจากสูตร Excel ไม่มีประสิทธิภาพเพียงพอหรือเป็นเครื่องมือที่ผิดอย่างสมบูรณ์ (และเชื่อฉันเรามี มีความรู้มากมายเกี่ยวกับสูตร Excel และสิ่งที่ไม่เป็นไปได้)


2

นับตั้งแต่ฉันอ่านบทความนี้ฉันได้คิดเกี่ยวกับแนวคิดนี้ ฉันคิดว่ามันมีประโยชน์สำหรับมันแน่นอน

สิ่งหนึ่งที่เกี่ยวกับการปรับให้เหมาะสมสิ่งนี้กระดาษคำนวณคล้ายกับพื้นที่หน่วยความจำ นอกจากนี้ยังคล้ายกับพื้นที่แสดงผลและพื้นที่พิมพ์ (เช่นใน x, y) มีประโยชน์มากมายเช่นกัน

เมื่อคุณสังเกตการบำรุงรักษาที่เปิดขึ้นมากความคิดสำหรับฉัน ฉันไม่ทราบว่ามีอะไรที่จะรวบรวมกับคุณสมบัติจริง ๆ และภาษาห้องสมุด ฯลฯ อาจจะค่อนข้างเจ็บปวด ถึงกระนั้นก็อาจมีอนาคตในบางแห่ง

ฉันได้เขียนสคริปต์ VB จริงๆสำหรับสเปรดชีตสมุดเกรดและบัญชี "ซอฟต์แวร์" เป็นส่วนใหญ่ ไม่เคยทำให้แอปที่ใช้งานได้ออกมาจากสเปรดชีตใด ๆ เลยยกเว้นส่วนต่อประสาน excel ไฟล์จากแอป C ++


1

ใช่ แต่ฉันคิดว่ามันเป็น "การทดสอบสเปรดชีต" มากกว่า "การเขียนโปรแกรมสเปรดชีต" ตัวอย่างเช่นเมื่อเร็ว ๆ นี้ฉันกำลังทำงานเกี่ยวกับคุณลักษณะสำหรับโครงการของเราที่เกี่ยวข้องกับการทำการคำนวณในฐานข้อมูลจำนวนมาก การคำนวณค่อนข้างง่าย แต่มีความสำคัญและต้องการการทดสอบเป็นพิเศษ นอกจากนี้สูตรที่เราใช้จำเป็นต้องมีการปรับตัวเล็กน้อยเพื่อให้เหมาะสมกับสถานการณ์ของเรา

ฉันวิ่งผ่านการคำนวณด้วยมือเพื่อเขียนการทดสอบหน่วยของฉันในขณะที่ผู้ทดสอบที่ฉันทำงานด้วยได้สร้างสเปรดชีตเหมือนที่คุณได้อธิบายไว้สำหรับใช้ในการทดสอบตั้งแต่ต้นจนจบ เนื่องจากการปรับสูตรแหล่งที่มาเราไม่ได้เปรียบเทียบข้อมูลการทดสอบอิสระดังนั้นสเปรดชีตจึงมีการตรวจสอบสไตล์ "การทำบัญชีสองรายการ" ที่ทำให้เรามั่นใจว่ารหัสถูกต้อง

ใช่ฉันเห็นว่าเทคนิคนี้มีประโยชน์มากในฐานะที่เป็นแหล่งข้อมูลการทดสอบสำหรับกรณีที่การคำนวณที่เกี่ยวข้องนั้นง่ายต่อการนำไปใช้ในสเปรดชีต แต่จำเป็นต้องมีการนำไปใช้ในโค้ด อย่างไรก็ตามสเปรดชีตดังกล่าวไม่ควรใช้เพื่อ "ระบุตรรกะการเขียนโปรแกรม" ต่อรายการ แต่เป็นเพียงผลลัพธ์สุดท้ายที่จำเป็น


1

สเปรดชีต "การเขียนโปรแกรม" เป็นประเภทของการเขียนโปรแกรมดาต้าโลว์

เรามีปัญหาทางภาษากับมันเราไม่ควรเรียกมันว่า "การเขียนโปรแกรม" เพราะมันน้อยกว่าที่เราเรียกว่าการเขียนโปรแกรม แต่มันชัดเจนมากกว่าการป้อนข้อมูลไปยังโปรแกรม

การเขียนโปรแกรม Dataflow เป็นสถาปัตยกรรมและระเบียบวินัยที่แอปพลิเคชันเป็นเครือข่ายของโมดูลอิสระพวกเขาส่งข้อความ (ข้อมูล) ซึ่งกันและกัน โมเดลนี้ไม่สามารถใช้ได้กับทุกปัญหาเฉพาะสำหรับปัญหาที่มีแหล่งข้อมูลหรือสตรีม (หรือมีมากกว่านั้น) ซึ่งไปที่เครือข่ายการประมวลผลและสร้างข้อมูล / สตรีมเอาต์พุต ดูรายการด้านล่าง

การเขียนโปรแกรม Dataflow มีหลายประเภทลองมาดูกัน:

  • สเปรดชีต: หมายเลขอินพุตจะถูกประมวลผลโดยสูตรจากนั้นจึงแสดงผลลัพธ์ตัวเลขและกราฟ คุณสมบัติพิเศษ: เวลา exectuion คือ "one-shot" เมื่อค่าอินพุต (คอมโพเนนต์) เปลี่ยนแปลงส่วนที่เหมาะสมของกราฟการประมวลผลจะทำงานอีกครั้งและสร้างเอาต์พุต
  • Unix pipe: เชลล์เรียกใช้งานหลายโปรแกรมและลิงก์ stdout-> stdin คุณสมบัติพิเศษ: อนุญาตให้ทำการเชื่อมโยงแบบท่อได้เท่านั้นกราฟเป็นคิวเดียว
  • การดำเนินการแบบซิงโครไนซ์: มีนาฬิกาซึ่งทำให้เกิดการประมวลผลของเฟรมหรือตัวอย่างในความถี่ที่ระบุ ทุกองค์ประกอบจะทำงานหนึ่งรอบนาฬิกา ตัวอย่างระบบประมวลผลภาพและเสียงจะทำงานในอัตราเฟรม / ตัวอย่างที่กำหนด
  • การทำงานแบบอะซิงโครนัส: กราฟไม่ได้ใช้งานจนกว่าจะมีเหตุการณ์ภายนอกเกิดขึ้น จากนั้นจะประมวลผลเหตุการณ์สร้างเอาต์พุตบางส่วน (หรือไม่) และไปที่สถานะว่าง

กลับไปที่คำถามของคุณ: ฉันคิดว่าใช่มันเป็นความคิดที่ดีที่จะเผยแพร่แอปพลิเคชัน dataflow เป็นแอพแบบสแตนด์อโลน ฉันทำไปแล้ว สองครั้ง

ฉันและเพื่อนของฉันได้สร้างระบบ DF ต้นแบบสำหรับระบบอัตโนมัติในบ้าน เราไม่มีเครื่องมือแก้ไขกราฟดังนั้นแอปไม่สามารถแก้ไขได้โดยผู้ใช้พารามิเตอร์บางอย่างถูกเก็บไว้ในไฟล์ปรับแต่ง แต่ไม่มีอะไรอื่น เรามีภาษาสคริปต์ DF ซึ่งเป็นรหัส "คอมไพล์" ถึง C ++ (รายการการสร้างส่วนประกอบและคำจำกัดความของข้อความ) ซึ่งได้รับการคอมไพล์ไปยังไฟล์สั่งการแบบเนทีฟ โมดูลคือคลาส C ++ (คลาสอื่น ๆ เพียงเพื่อรับข้อมูลบางอย่างเกี่ยวกับระบบของเรา: ข้อความ, ผู้จัดจำหน่าย, ส่วนประกอบ (นามธรรม), พอร์ต (นามธรรม), ConsumerPort, ProducerPort)

นอกจากนี้เรายังประหลาดใจกับข้อได้เปรียบของระบบ DF ที่ให้บริการ: เราได้สร้างแอปอนุกรมดมกลิ่นภายใน 2 นาทีหรือเราได้จัดทำโปรแกรมทดสอบในสถานที่ซึ่งกะพริบหลอดไฟทีละรายการ (ไม่มีเอกสารประกอบ บน ID ฮาร์ดแวร์) เราได้สร้างส่วนประกอบ MIDI และ joypad เพื่อความสนุกสนานฉันยังได้สร้างอวัยวะที่เบาอีกด้วย (ดูhttp://homeaut.com/under_construction/ )

ฉันสามารถเห็นปัญหาได้เพียงครั้งเดียวในกรณีของสเปรดชีต: เนื่องจากทุกหมายเลขและสูตร (อาจเป็น: ทุกเซลล์) เป็นองค์ประกอบกราฟของคุณจะไม่เป็นที่สิ้นสุด เมื่อคุณเพิ่มบรรทัดลงในแอปผลรวม () อย่างง่ายของคุณแสดงว่ากราฟดาต้าโฟลว์เปลี่ยนไป ดังนั้นคุณต้อง "reprogramming" กราฟในเวลาทำงานหรือเราควรเรียกมันว่า "metaprogramming" ใน Excel แมโครจะทำงานได้ แต่จากนั้นเราปล่อยความบริสุทธิ์ของดาต้าโฟลว์

ฉันมีทางออกที่ไม่ดีเกินไป แต่ไม่สมบูรณ์แบบ ฉันทำสเปรดชีตเป็นแอป AJAX ที่มีแบ็กเอนด์ PHP แกนแนวตั้งคือเวลา (วัน) เส้นเป็นส่วนประกอบ มีส่วนประกอบเช่นอินพุต (บรรทัดสามารถแก้ไขได้โดยผู้ใช้) ค่าเฉลี่ยแนวตั้งค่าเฉลี่ยแนวนอน / ผลรวมและการคำนวณทางสถิติเฉพาะโดเมนบางรายการ มีปัญหาเดียวเท่านั้นคือนี่คือ "หนึ่งมิติ" ตราบใดที่ฉันต้องการเพียงผลรวมและเฉลี่ยและอะไรก็ตามฉันสามารถเพิ่มบรรทัดใหม่และสร้างส่วนประกอบซึ่งคำนวณสิ่งของ แต่มีข้อ จำกัด อย่างมาก: คอลัมน์มักเป็นวัน (ฉันได้สร้าง "มุมมอง" สัปดาห์และเดือนซึ่งแสดงข้อมูลรายวันเป็นผลรวม / เฉลี่ย แต่ก็ยังคงเป็นมิติเดียว) ฉันไม่สามารถแสดงได้มันเป็นการทำงานร่วมกันและต้องการให้แบ็กเอนด์ PHP รัน 7/24 ซึ่งไม่ได้รับการสนับสนุนจากผู้ให้บริการโฮสต์ของฉัน

ดังนั้นโมเดลของฉัน (ซึ่งสามารถอธิบายได้ดีที่สุดว่า: "วันแนวนอน") ไม่สามารถรับมือกับปัญหาแบบอื่นได้

ฉันมีความคิดวิธีการที่จะแก้ปัญหานี้: แท็บ

เมื่อคุณติดขัดใน Excel และต้องสร้างตารางอื่นคุณสามารถใช้พื้นที่ที่แตกต่างบนแท็บเดียวกันหรือเปิดแท็บอื่น นอกจากนี้การอ้างอิงระหว่างแท็บไม่สบายฉันชอบวิธีแรก ฉันคิดว่าแท็บควรจะแสดงบนหน้าจอเดียวกันเช่นหน้าต่างที่ไม่ทับซ้อนกัน

ทุกตารางควรมีแกนการเติบโต: แนวตั้งแนวนอนหรือคงที่ ตารางการเจริญเติบโตในแนวตั้งมีองค์ประกอบของบรรทัด (เช่นเดียวกับสเปรดชีทตามวันของฉัน) ที่คอลัมน์ทั้งหมดมีสูตร "เดียวกัน" ส่วนประกอบแนวนอนมีส่วนประกอบของคอลัมน์ตารางขนาดคงที่ก็เหมือนกับสเปรดชีตใด ๆ

ดังนั้นเมื่อผู้ใช้เพิ่มบรรทัด / คอลัมน์ใหม่บรรทัด / คอลัมน์ใหม่จะมีสูตรเดียวกัน

นอกจากนี้ในสเปรดชีตฉันเกลียดสิ่งที่ฉันต้องการคัดลอกสูตรเดียวกันมาก 1,000 ครั้งถ้าฉันมี 1,000 บรรทัด มันเป็นแหล่งของข้อบกพร่อง (การรักษาสูตรเวอร์ชันเก่าในบางบรรทัด), หน่วยความจำไม่เพียงพอ (การจัดเก็บสูตรเดียวกัน 1000x)

บางทีฉันผิดและมีแนวคิดเรื่องข้อบกพร่องในรุ่นนี้ แต่ฉันหวังว่ามันจะเป็นการกระตุ้นความคิดที่ดี


ฉันมักจะสงสัยว่าสเปรดชีตจำเป็นต้องมีการพูดจาโผงผาง "แถว: คอลัมน์ที่ถือว่าอันตราย" โดยที่ทุกอย่างเป็นช่วงที่มีชื่อและสูตรจะใช้กับช่วงและเซลล์จะใช้เป็นอินพุต / จอแสดงผล
Sherwood Botsford

0

ความคิดของฉันคือการใช้สเปรดชีตเพื่อกำหนดตรรกะสำหรับการคำนวณและในขณะที่ทำเช่นนี้พยายามตั้งค่าสเปรดชีตในลักษณะที่ทำให้ภาษาโปรแกรมเป็นมิตร โดยมิตรฉันหมายถึง -> ใช้ช่วงชื่อ / การอ้างอิงแทนพิกัด cellXY และแยกย่อยสูตรออกเป็นชิ้นเล็ก ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.