আমি স্টুয়ার্ট সিয়েরার আলোচনা " ডেটা থিংক ইন ডেটা " দেখেছি এবং আমি এই গেমটি তৈরি করছি তার ডিজাইনের নীতি হিসাবে এটি থেকে একটি ধারণা নিয়েছি। পার্থক্যটি হ'ল তিনি ক্লজুরে কাজ করছেন এবং আমি জাভাস্ক্রিপ্টে কাজ করছি। আমি আমাদের ভাষার মধ্যে কিছু বড় পার্থক্য দেখতে পাচ্ছি:
- ক্লোজার হ'ল আইডেমিক্যালি ফাংশনাল প্রোগ্রামিং
- বেশিরভাগ রাজ্য অপরিবর্তনীয়
আমি "সবকিছুই একটি মানচিত্র" স্লাইড (11 মিনিট, 6 সেকেন্ড থেকে> 29 মিনিটের মধ্যে) স্লাইডটি থেকে ধারণা নিয়েছি। কিছু জিনিস যা সে বলে:
- আপনি যখনই কোনও ফাংশন দেখতে পান যেখানে ২-৩ টি আর্গুমেন্ট লাগে, আপনি এটিকে মানচিত্রে পরিণত করার জন্য এবং কেবল একটি মানচিত্রকে পাস করার জন্য একটি কেস তৈরি করতে পারেন to এর অনেক সুবিধা রয়েছে:
- যুক্তি আদেশ সম্পর্কে আপনাকে চিন্তা করতে হবে না
- কোনও অতিরিক্ত তথ্য সম্পর্কে আপনাকে চিন্তা করতে হবে না। যদি অতিরিক্ত কী থাকে তবে তা আমাদের উদ্বেগ নয়। এগুলি কেবল প্রবাহিত হয়, তারা হস্তক্ষেপ করে না।
- আপনাকে স্কিমা সংজ্ঞায়িত করতে হবে না
- কোনও অবজেক্টে যাওয়ার বিপরীতে কোনও তথ্য গোপন নেই। তবে, তিনি কেসটি তৈরি করেন যে ডেটা লুকানো সমস্যার কারণ হতে পারে এবং ওভাররেটেড হয়:
- কর্মক্ষমতা
- বাস্তবায়নের সহজতা
- নেটওয়ার্ক বা প্রক্রিয়াগুলি জুড়ে আপনি যোগাযোগ করার সাথে সাথেই আপনাকে উভয় পক্ষই উপাত্ত উপস্থাপনায় যেভাবেই হোক তাতে সম্মত হতে হবে। এটি অতিরিক্ত কাজ আপনি যদি কেবলমাত্র ডেটাতে কাজ করেন তবে আপনি এড়াতে পারবেন।
আমার প্রশ্নের সাথে সর্বাধিক প্রাসঙ্গিক। এটি 29 মিনিটের মধ্যে: "আপনার ফাংশনগুলি রচনাযোগ্য করুন"। ধারণাটি ব্যাখ্যা করতে তিনি যে কোড কোডটি ব্যবহার করেন তা এখানে:
;; Bad (defn complex-process [] (let [a (get-component @global-state) b (subprocess-one a) c (subprocess-two a b) d (subprocess-three a b c)] (reset! global-state d))) ;; Good (defn complex-process [state] (-> state subprocess-one subprocess-two subprocess-three))
আমি বুঝতে পেরেছি যে বেশিরভাগ প্রোগ্রামার ক্লোজারের সাথে পরিচিত নয়, তাই আমি এটি আবশ্যক স্টাইলে আবার লিখব:
;; Good def complex-process(State state) state = subprocess-one(state) state = subprocess-two(state) state = subprocess-three(state) return state
এখানে সুবিধা রয়েছে:
- পরীক্ষা সহজ
- বিচ্ছিন্নভাবে এই ফাংশনগুলি দেখতে সহজ
- এর একটি লাইন মন্তব্য করা সহজ এবং একটি একক পদক্ষেপ সরিয়ে ফলাফল কী হবে তা দেখুন
- প্রতিটি সাব-প্রসেস রাজ্যে আরও তথ্য যুক্ত করতে পারে। সাবপ্রসেস যদি তিনটি উপ-প্রসেসের জন্য কোনও কিছুতে যোগাযোগের প্রয়োজন হয় তবে এটি কী / মান যুক্ত করার মতোই সহজ।
- আপনার রাজ্যের বাইরে থাকা ডেটাগুলি বের করার জন্য কোনও বয়লারপ্লেট নেই যাতে আপনি এটিকে আবার ফিরিয়ে দিতে পারেন Just পুরো রাজ্যে কেবল পাস করুন এবং সাবপ্রসেসটিকে যা প্রয়োজন তা নির্ধারণ করুন।
এখন, আমার পরিস্থিতি ফিরে: আমি এই পাঠটি নিয়েছি এবং এটি আমার খেলায় প্রয়োগ করেছি। এটি হ'ল আমার প্রায় সমস্ত উচ্চ স্তরের ফাংশন কোনও gameState
বস্তু গ্রহণ করে এবং ফেরত দেয় । এই অবজেক্টটিতে গেমের সমস্ত ডেটা রয়েছে। ইজি: ব্যাডগুইসের একটি তালিকা, মেনুগুলির একটি তালিকা, মাটিতে লুটপাট ইত্যাদি my এখানে আমার আপডেট ফাংশনের উদাহরণ রয়েছে:
update(gameState)
...
gameState = handleUnitCollision(gameState)
...
gameState = handleLoot(gameState)
...
আমি এখানে যা জিজ্ঞাসা করতে চাই তা হ'ল, আমি কি এমন কিছু ঘৃণা তৈরি করেছি যা একটি ধারণাটিকে বিকৃত করে ফেলেছিল যা কেবলমাত্র কার্যকরী প্রোগ্রামিং ভাষায় ব্যবহারিক? জাভাস্ক্রিপ্ট আইডোমেটিকভাবে কার্যকর নয় (যদিও এটি সেভাবেই লেখা যেতে পারে) এবং তা পরিবর্তনযোগ্য ডেটা কাঠামো লিখতে সত্যই চ্যালেঞ্জিং। একটি বিষয় যা আমাকে উদ্বেগ করে তা হ'ল তিনি ধরে নেন যে এই সমস্ত উপ-প্রক্রিয়াগুলির প্রতিটি শুদ্ধ। কেন এই অনুমান করা দরকার? এটি বিরল যে আমার কোনও ফাংশন খাঁটি (এর দ্বারা, তারা বোঝায় যে তারা প্রায়শই সংশোধন করে gameState
। এর বাইরে আমার কোনও জটিল পার্শ্ব প্রতিক্রিয়া নেই)। আপনার কাছে অবিচ্ছেদ্য ডেটা না থাকলে এই ধারণাগুলি কি আলাদা হয়ে যায়?
আমি উদ্বিগ্ন যে একদিন আমি জেগে উঠব এবং উপলব্ধি করব যে এই পুরো নকশাটি একটি লজ্জাজনক এবং আমি সত্যিই কেবলমাত্র বিগ বল অফ কাদার বিরোধী প্যাটার্ন বাস্তবায়ন করছি ।
সত্যি বলতে, আমি কয়েক মাস ধরে এই কোডটিতে কাজ করছি এবং দুর্দান্ত হয়েছে। আমার মনে হচ্ছে আমি দাবি করা সমস্ত সুবিধা পাচ্ছি। আমার কোডটি আমার পক্ষে পক্ষে যুক্তিযুক্ত super তবে আমি একজন ওয়ান ম্যান দল তাই আমার জ্ঞানের অভিশাপ আছে।
হালনাগাদ
আমি এই প্যাটার্নটি সহ 6+ মাস কোডিং করছি। সাধারণত এই সময়ের মধ্যে আমি আমি কী করেছি তা ভুলে গিয়েছি এবং সেখানেই "আমি কি এটি একটি পরিষ্কার উপায়ে লিখেছি?" খেলা আসে। যদি আমার না হয়, আমি সত্যিই সংগ্রাম করব। এখন পর্যন্ত আমি মোটেও লড়াই করছি না।
আমি বুঝতে পারি যে চোখের অন্য সেটটি কীভাবে এটির রক্ষণাবেক্ষণযোগ্যতা যাচাই করার প্রয়োজন হবে। আমি যা বলতে পারি তা হ'ল আমি প্রথম এবং সর্বাগ্রে রক্ষণাবেক্ষণ সম্পর্কে যত্নবান। আমি যেখানেই কাজ করি না কেন ক্লিন কোডের জন্য আমি সর্বদা উচ্চস্বরে প্রচারক।
কোডিংয়ের এই পদ্ধতিতে যাদের ইতিমধ্যে একটি খারাপ ব্যক্তিগত অভিজ্ঞতা আছে তাদের সরাসরি জবাব দিতে চাই। আমি তখন এটি জানতাম না তবে আমি মনে করি আমরা সত্যিই কোড লেখার দুটি ভিন্ন পদ্ধতির কথা বলছি। আমি যেভাবে এটি করেছি তা অন্যের অভিজ্ঞতা অর্জনের চেয়ে আরও কাঠামোগত বলে মনে হচ্ছে। যখন কারও কাছে "সমস্ত কিছু একটি মানচিত্র" এর সাথে খারাপ অভিজ্ঞতা হয় তখন তারা বজায় রাখা কতটা কঠিন তা নিয়ে কথা বলেন কারণ:
- ফাংশনটির জন্য প্রয়োজনীয় মানচিত্রের কাঠামোটি আপনি কখনই জানেন না
- যে কোনও ক্রিয়াকলাপটি আপনি কখনই প্রত্যাশা করবেন না সেভাবে ইনপুটটিকে পরিবর্তন করতে পারে। কোনও নির্দিষ্ট কী কীভাবে মানচিত্রে প্রবেশ করেছে বা কেন এটি অদৃশ্য হয়েছে তা জানতে আপনাকে সমস্ত কোড বেসের সন্ধান করতে হবে।
এই জাতীয় অভিজ্ঞতা রয়েছে তাদের ক্ষেত্রে সম্ভবত কোড বেসটি ছিল, "সবকিছুতে এন প্রকারের 1 মানচিত্র লাগে" " খনিটি হ'ল, "সবকিছুতে 1 ধরণের মানচিত্র 1 লাগে"। আপনি যদি এই 1 টি ধরণের কাঠামো জানেন তবে আপনি সমস্ত কিছুর কাঠামো জানেন। অবশ্যই, সেই কাঠামোটি সাধারণত সময়ের সাথে বাড়তে থাকে। এই জন্য...
রেফারেন্স বাস্তবায়ন (যেমন: স্কিমা) দেখার জন্য একটি জায়গা রয়েছে। এই রেফারেন্স বাস্তবায়নটি কোডটি গেমটি ব্যবহার করে তাই এটি তারিখের বাইরে যেতে পারে না।
দ্বিতীয় দফার হিসাবে, আমি রেফারেন্স বাস্তবায়নের বাইরে মানচিত্রে কীগুলি যুক্ত / সরান না, ইতিমধ্যে যা আছে তা আমি কেবল পরিবর্তন করি mut আমার কাছে স্বয়ংক্রিয় পরীক্ষার একটি বড় স্যুটও রয়েছে।
যদি এই স্থাপত্যটি শেষ পর্যন্ত তার নিজের ওজনের নীচে পড়ে যায় তবে আমি একটি দ্বিতীয় আপডেট যুক্ত করব। অন্যথায়, ধরে নিন সবকিছু ঠিকঠাক চলছে :)