क्या आप "स्प्रेडशीट प्रोग्रामिंग" के लिए उपयोग करते हैं? [बन्द है]


11

थोड़ी देर पहले मैं प्रोग्रामिंग लॉजिक को निर्दिष्ट करने के तरीके के रूप में स्प्रेडशीट (मेरा मतलब है सेल और मैक्रो कोड नहीं) का उपयोग करने की अवधारणा पर ठोकर खाई थी। विचार यह है:

  • गणनाओं के एक साफ-सुथरे परिभाषित प्रवाह के साथ एक स्प्रेडशीट बनाएं (जो कभी-कभी प्रक्रियात्मक या वस्तु उन्मुख प्रोग्रामिंग शैलियों के बजाय स्प्रेडशीट के "डेटाफ्लो" प्रतिमान के लिए बेहतर होते हैं)

  • इनपुट कोशिकाओं को परिभाषित करें

  • आउटपुट सेल परिभाषित करें

  • एक खड़े अकेले निष्पादन योग्य वर्ग (या फ़ंक्शन, प्रक्रिया, ...) में पूरी बात संकलित करें

  • एक व्यापक सॉफ्टवेयर परियोजना के भीतर सामान्य कोड में इसका उपयोग करें

  • समय के साथ बनाए रखने के लिए स्रोत कोड के रूप में स्प्रेडशीट का उपयोग करें

मॉडल में वास्तव में फिट होने वाली समस्याओं के लिए इस तकनीक का उपयोग करने का विचार है और यह स्वाभाविक रूप से अच्छी तरह से प्रलेखित और आसान बनाए रखने योग्य कोड को जन्म देगा। मुझे यह जानने में दिलचस्पी है कि क्या आपने तकनीक का उपयोग करने का अनुभव किया है और क्या। एक उदाहरण एप्लिकेशन जो मेरे दिमाग में आया, वह है बीमा टैरिफ कैलकुलेटर, जो आम तौर पर एक्सेल शीट पर एक्ट्यूरीज द्वारा मसौदा तैयार, निर्मित और मान्य किए जाते हैं और बाद में कुछ हार्ड-टू-मेंटेनेंस लॉजिक लॉजिक में इसे कोडित किया जाता है (यह एक दर्दनाक प्रक्रिया है)।


मैं इस सवाल को बंद करके खुश नहीं हूं। ठीक है, "हां" या "नहीं" या "str_replace ()" जैसा कोई जवाब नहीं है, लेकिन यह दिलचस्प चर्चा शुरू करता है। यहाँ हम चलते हैं: meta.programmers.stackexchange.com/questions/5652/…
ern0

@ ern0 आपने टूर पेज चेक किया ? "प्रोग्रामर सभी जवाब पाने के बारे में है । यह एक चर्चा मंच नहीं है ..."
gnat

जवाबों:


5

हालाँकि यह "स्प्रेडशीट का निर्माण" की शैली के बारे में ठीक नहीं है, इसे कोड में संकलित करें "जिसके बारे में आप पूछ रहे थे, CLOS के लिए डेटा प्रवाह का विस्तार एक समान मॉडल का उपयोग करता है: डेटा प्रवाह और परिवर्तनों को व्यक्त करने वाले सूत्र" स्रोत सामग्री "/ प्रतिनिधित्व हो सकते हैं। रिकॉर्ड के लिए "वस्तु / वर्ग डिजाइन। इसे बनाने के लिए एक वैकल्पिक तरीका पर विचार करें, जिसके बारे में आप पूछ रहे थे।

और सिर्फ मनोरंजन के लिए: स्प्रेडशीट मैक्रो


1
मुझे यकीन है कि यह ओपी के दिमाग में नहीं था।
zzzzBov

4
@zzzzBov, हालांकि, यह पूरी तरह से ओपी के विवरण को फिट बैठता है।
एसके-तर्क

3

जो कभी-कभी प्रक्रियात्मक या वस्तु उन्मुख प्रोग्रामिंग शैलियों के बजाय स्प्रेडशीट के "डेटाफ्लो" प्रतिमान के लिए बेहतर होते हैं

ईमानदारी से, मैं शायद ही किसी भी वास्तविक दुनिया की गणना के बारे में सोच सकता हूं जहां यह लागू होता है। "डेटाफ़्लो" प्रोग्रामिंग को आसानी से बहुत सारी आधुनिक प्रोग्रामिंग भाषाओं में किया जा सकता है (.NET वर्ल्ड में LINQ देखें, या पर्ल और पायथन के लिस्ट प्रोसेसिंग ऑपरेटर्स), और मेरे अनुभव के अनुसार, एक गुच्छा की तुलना में बहुत अधिक बनाए रखने योग्य कोड का परिणाम है "स्प्रेडशीट फ़ार्मुलों" के साथ हार्ड-सेल बनाए रखने के लिए।

दूसरी ओर, मैंने और मेरे सहयोगियों ने बहुत सारे स्प्रेडशीट-आधारित (MS-Excel, सटीक होने के लिए) एप्लिकेशन बनाए हैं, जहां एक्सेल का उपयोग इनपुट डेटा दर्ज करने / बहुत तेज़ी से इनपुट मास्क बनाने के लिए एक उपयोगकर्ता के अनुकूल उपकरण के रूप में किया गया था, या स्वरूपित आउटपुट या दोनों बनाने के लिए। उन सभी मामलों में, एक्सेल फ़ार्मुलों द्वारा उस डेटा की गणना या प्रसंस्करण नहीं किया गया था (या केवल आंशिक रूप से किया गया था), लेकिन प्रोग्राम कोड द्वारा, क्योंकि एक्सेल फ़ार्मुलों पर्याप्त शक्तिशाली नहीं थे या पूरी तरह से गलत उपकरण (और मेरा विश्वास करो, हमारे पास एक है) एक्सेल फ़ार्मुलों के साथ क्या संभव है और क्या नहीं है)।


2

जब से मैंने इस लेख को पढ़ा है तब से मैं इस अवधारणा के बारे में सोच रहा हूँ। मुझे लगता है कि निश्चित रूप से इसके लिए एक उपयोग है।

इस तरह की चीज के अनुकूलन के बारे में एक बात, एक फैल शीट मेमोरी स्पेस के समान है। यह अंतरिक्ष को प्रदर्शित करने और प्रिंट करने के लिए भी समान है (जैसे x, y)। वहां भी बहुत लाभ।

जब आपने निरंतरता का उल्लेख किया, तो मेरे लिए विचारों का एक बहुत खुल गया। मुझे नहीं पता कि क्या वास्तव में और भाषा सुविधाओं, पुस्तकालयों आदि के साथ संकलित करने के लिए बाहर है .. काफी दर्द हो सकता है। फिर भी, इसमें कहीं न कहीं भविष्य हो सकता है।

मैंने वास्तव में केवल स्प्रेडशीट, ग्रेडबुक और अकाउंटिंग "सॉफ्टवेयर" के लिए वीबी स्क्रिप्ट लिखी है। C ++ ऐप से एक्सेल फ़ाइल इंटरफ़ेस को छोड़कर किसी भी स्प्रेडशीट से बाहर निष्पादन योग्य ऐप्स कभी नहीं बनाया गया।


1

हां, हालांकि मैं इसे "स्प्रेडशीट प्रोग्रामिंग" के बजाय "स्प्रेडशीट परीक्षण" के रूप में अधिक मानता हूं। उदाहरण के लिए, हाल ही में मैं अपनी परियोजना के लिए एक फीचर पर काम कर रहा था जिसमें बड़ी संख्या में डेटाबेस रिकॉर्ड्स पर गणना करना शामिल है। गणना अपेक्षाकृत सरल थी फिर भी महत्वपूर्ण है और इसलिए विशेष रूप से परीक्षण की आवश्यकता है। इसके अलावा, जिस सूत्र का हम उपयोग कर रहे थे, वह हमारी स्थिति पर लागू होने के लिए अनुकूलन की एक छोटी राशि की आवश्यकता थी।

मैं अपनी इकाई परीक्षणों को लिखने के लिए हाथ से कुछ गणनाओं के माध्यम से भागा, जबकि जिस परीक्षक के साथ मैं काम कर रहा था, उसने एक स्प्रेडशीट बनाई, जैसे आपने उसके एंड-टू-एंड परीक्षणों में उपयोग के लिए वर्णित किया है। स्रोत सूत्र के अनुकूलन के कारण हमारे पास तुलना करने के लिए कोई स्वतंत्र परीक्षण डेटा नहीं था, इसलिए स्प्रेडशीट ने एक प्रकार की "डबल-एंट्री बुककीपिंग" शैली की जांच प्रदान की जिसने हमें विश्वास दिलाया कि कोड सही था।

तो हां, मैं इस तकनीक को उन मामलों के परीक्षण डेटा के स्रोत के रूप में बहुत उपयोगी होने के रूप में देखता हूं जहां शामिल गणनाओं को एक स्प्रेडशीट में लागू करना आसान है, लेकिन अन्यथा उन्हें कोड में लागू करना आवश्यक है। हालांकि, इस तरह की स्प्रेडशीट का उपयोग प्रति क्रम "प्रोग्रामिंग तर्क निर्दिष्ट करने के लिए" नहीं किया जाना चाहिए, लेकिन केवल आवश्यक अंतिम परिणाम है।


1

स्प्रेडशीट "प्रोग्रामिंग" एक प्रकार का डेटाफ्लो प्रोग्रामिंग है।

हमें इसके साथ एक भाषाई समस्या है, हमें इसे "प्रोग्रामिंग" नहीं कहना चाहिए, क्योंकि यह प्रोग्रामिंग कहे जाने की तुलना में बहुत कम है, लेकिन यह प्रोग्राम में डेटा दर्ज करने से अधिक निश्चित है।

डेटाफ्लो प्रोग्रामिंग एक वास्तुकला और अनुशासन है, जहां एप्लिकेशन स्वतंत्र मॉड्यूल का एक नेटवर्क है, वे एक दूसरे को संदेश (डेटा) भेजते हैं। यह मॉडल हर समस्या के लिए लागू नहीं है, केवल उन लोगों के लिए, जहां एक स्रोत डेटा या स्ट्रीम है (या अधिक हैं), जो प्रसंस्करण नेटवर्क को जाता है, और आउटपुट डेटा / स्ट्रीम बनाता है। नीचे देखें लिस्ट

डेटाफ्लो प्रोग्रामिंग के कई प्रकार हैं, आइए देखते हैं कुछ:

  • स्प्रेडशीट: इनपुट नंबरों को फ़ार्मुलों द्वारा संसाधित किया जाता है, फिर नंबरों और ग्राफ़ का परिणाम होता है। विशेष विशेषताएं: एक्सक्यूशन टाइम "वन-शॉट" है, जब इनपुट वैल्यू (घटक) बदलता है, तो प्रोसेसिंग ग्राफ का अप्रोच भाग पुन: चलता है और आउटपुट उत्पन्न करता है।
  • यूनिक्स पाइप: खोल कई कार्यक्रमों को लॉन्च करता है, और स्टडआउट-> स्टडिन को जोड़ता है। विशेष विशेषताएं: केवल पाइप-स्टाइल लिंकिंग की अनुमति है, ग्राफ एक एकल कतार है।
  • सिंक्रोनाइज़्ड एक्ज़ीक्यूशन: एक क्लॉक होती है, जो किसी फ्रिक्वेंसी में फ्रेम या सैंपल की प्रोसेसिंग को ट्रिगर करती है। हर घटक एक बार एक चक्र चक्र चलाता है। वीडियो और ऑडियो प्रोसेसिंग सिस्टम उदाहरण हैं, वे एक निर्दिष्ट फ्रेम / नमूना दर पर काम करते हैं।
  • अतुल्यकालिक निष्पादन: ग्राफ तब तक निष्क्रिय रहता है, जब तक कोई बाहरी घटना नहीं होती है। फिर यह घटना को संसाधित करता है, कुछ आउटपुट (या नहीं) उत्पन्न करता है, और निष्क्रिय स्थिति में जाता है।

अपने प्रश्न पर वापस जाएं: मुझे लगता है कि हां, एक स्टैंडअलोन ऐप के रूप में डेटाफ्लो एप्लिकेशन को प्रकाशित करना अच्छा है। मैं पहले ही बना चुका हूं। दो बार

मुझे और मेरे एक दोस्त ने होम ऑटोमेशन के लिए एक प्रोटोटाइप डीएफ सिस्टम बनाया है। हमारे पास कोई ग्राफ़ संपादक नहीं है, इसलिए ऐप उपयोगकर्ता द्वारा संपादन योग्य नहीं है, कुछ मापदंडों को एक कॉन्फ़िगर फ़ाइल में संग्रहीत किया जाता है, लेकिन कुछ और नहीं। हमारे पास एक DF स्क्रिप्ट भाषा है, जो C ++ कोड (घटक निर्माण और संदेश परिभाषाओं की एक सूची) के लिए "संकलित" है, जो एक मूल निष्पादन योग्य के लिए संकलित हो जाती है। मॉड्यूल सी ++ कक्षाएं (अन्य वर्ग हैं, बस हमारे सिस्टम के बारे में कुछ जानकारी प्राप्त करने के लिए: संदेश, डिस्पैसर, कंपोनेंट (सार), पोर्ट (सार), कंज्यूमरपोर्ट, प्रोड्यूसरपोर्ट)।

इसके अलावा, हम एक DF प्रणाली प्रदान करने के फायदे से चकित थे : हमने 2 मिनट के भीतर सीरियल स्निफ़र ऐप बनाया है, या हमने एक साइट पर एक परीक्षण कार्यक्रम बनाया है , जो एक-एक करके लैंप को झपकाता है (कोई प्रलेखन नहीं थे) हार्डवेयर आईडी पर)। हमने केवल मनोरंजन के लिए मिडी और हर्षपेड घटक बनाए हैं, मैंने इसके साथ एक हल्का अंग भी बनाया है (देखें http://homeaut.com/under_construction )!

मैं स्प्रेडशीट के मामले में केवल एक ही कठिनाई देख सकता हूं: जैसा कि प्रत्येक संख्या और सूत्र (संभावित रूप से: प्रत्येक सेल) एक घटक है, आपका ग्राफ अंतिम नहीं है। जब आप अपने साधारण योग () ऐप में एक पंक्ति जोड़ते हैं, तो इसका मतलब है कि डेटाफ्लो ग्राफ बदल गया है। तो, आपको रन-टाइम में ग्राफ को "रीप्रोग्रामिंग" करना होगा, या हमें इसे "मेटाप्रोग्रामिंग" कहना चाहिए। एक्सेल में, एक मैक्रो काम करेगा, लेकिन फिर हमने डेटाफ्लो की शुद्धता को ढीला कर दिया।

मेरे पास एक बहुत-बुरा-बुरा-नहीं-सही समाधान है। मैंने एक स्प्रेडशीट बनाई है, PHP बैकएंड के साथ एक AJAX ऐप। ऊर्ध्वाधर अक्ष समय (दिन) है, लाइनें घटक हैं। घटक होते हैं, जैसे इनपुट (लाइन को उपयोगकर्ता द्वारा संपादित किया जा सकता है), ऊर्ध्वाधर औसत, क्षैतिज औसत / योग, और कुछ डोमेन-विशिष्ट सांख्यिकीय गणना। इसके साथ केवल एक समस्या है: यह "एक आयामी" है। जब तक मुझे सिर्फ योग और एवीजी चाहिए और जो भी हो, मैं नई लाइनें जोड़ सकता हूं, और घटक बना सकता हूं, जो सामान की गणना करता है। लेकिन एक मजबूत बाधा है: कॉलम हमेशा दिन होते हैं (मैंने सप्ताह और महीने को "दृश्य" बनाया है, जो दैनिक डेटा को योग / एवीजी के रूप में प्रदर्शित करता है, लेकिन यह अभी भी एक आयामी है)। मैं इसे नहीं दिखा सकता, यह सहयोगी है और इसे 7/24 चलाने के लिए PHP बैकएंड कार्य की आवश्यकता है, यह मेरे होस्ट प्रदाता द्वारा समर्थित नहीं है।

तो, मेरा मॉडल (जिसे सबसे अच्छा वर्णित किया जा सकता है: "दिन क्षैतिज रूप से") अन्य प्रकार की समस्याओं को संभालने में सक्षम नहीं है।

मेरे पास एक विचार है, इस समस्या को कैसे हल करें: टैब

जब आप एक्सेल में फंस जाते हैं, और दूसरी तालिका बनानी होती है, तो आप उसी टैब पर एक अलग क्षेत्र का उपयोग कर सकते हैं, या किसी अन्य टैब को खोल सकते हैं। इसके अलावा, टैब के बीच संदर्भ असहज है, मैं पहली विधि पसंद करता हूं। मुझे लगता है, टैब को एक ही स्क्रीन पर प्रदर्शित किया जाना चाहिए, जैसे गैर-अतिव्यापी विंडोज़।

प्रत्येक तालिका की अपनी बढ़ती हुई धुरी होनी चाहिए: ऊर्ध्वाधर, क्षैतिज या स्थिर। वर्टिकल ग्रोइंग टेबल में लाइन कंपोनेंट्स होते हैं (जैसे मेरा डे-आधारित स्प्रेडशीट), जहां सभी कॉलम में "समान" फॉर्मूला होता है, क्षैतिज घटकों में कॉलम कंपोनेंट होते हैं, फिक्स्ड-साइज टेबल किसी भी स्प्रेडशीट की तरह होते हैं।

इसलिए, जब उपयोगकर्ता एक नई लाइन / कॉलम जोड़ता है, तो नई लाइन / कॉलम में एक ही सूत्र होगा।

इसके अलावा, स्प्रैडशीट में, मुझे इस बात से नफरत है, कि मुझे 1000 बार, यदि मेरे पास 1000 रेखाएँ हैं, तो मुझे एक ही फॉर्मूला कॉपी करने की ज़रूरत है। यह बग्स का स्रोत है (कुछ लाइनों में पुराने संस्करण को सूत्र में रखते हुए), मेमोरी की बर्बादी (उसी फॉर्मूले को 1000x स्टोर करना)।

शायद मैं गलत हूं, और इस मॉडल में अवधारणा कीड़े हैं, लेकिन मुझे आशा है कि यह एक अच्छा विचार-उत्तेजक था।


मैंने अक्सर सोचा है कि अगर स्प्रेडशीट को "रो: कॉलम को हानिकारक माना जाता है" शेख़ी की आवश्यकता होती है। जहां सब कुछ एक नामित सीमा होती है, और सूत्र पर्वतमाला पर लागू होते हैं, और कोशिकाओं को इनपुट / डिस्प्ले के रूप में उपयोग किया जाता है।
शेरवुड बॉट्सफोर्ड

0

मेरा विचार गणनाओं के लिए तर्क को परिभाषित करने के लिए स्प्रेडशीट का उपयोग करना होगा और ऐसा करते समय स्प्रेडशीट को इस तरह से सेटअप करने का प्रयास करना चाहिए ताकि यह प्रोग्रामिंग भाषा को अनुकूल बना सके। फ्रेंडली से मेरा मतलब है -> सेलएक्सवाई निर्देशांक के बजाय नाम पर्वतमाला / संदर्भों का उपयोग करना और सूत्र को छोटे टुकड़ों में तोड़ना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.