কনস্ট্রাক্টরের কিছুক্ষণ (সত্য) লুপটি আসলে খারাপ কেন?


47

সাধারণ প্রশ্ন থাকা সত্ত্বেও আমার ক্ষেত্রটি বরং সি #, কারণ আমি জানি যে সি ++ এর মতো ভাষাগুলিতে কনস্ট্রাক্টর এক্সিকিউশন, মেমরি ম্যানেজমেন্ট, অপরিবর্তিত আচরণ ইত্যাদি সম্পর্কিত বিভিন্ন শব্দার্থবিজ্ঞান রয়েছে aware

কেউ আমাকে একটি আকর্ষণীয় প্রশ্ন জিজ্ঞাসা করেছিলেন যা আমার পক্ষে সহজে উত্তর দেওয়া হয়নি।

কেন (বা এটি আদৌ?) শ্রেণীর একজন নির্মাতাকে কখনও শেষ না হওয়া লুপ (অর্থাত্ গেম লুপ) শুরু করতে খারাপ নকশা হিসাবে বিবেচনা করা হয়?

কিছু ধারণা রয়েছে যা এর দ্বারা ভেঙে গেছে:

  • অন্তত বিস্ময়ের নীতি মত, ব্যবহারকারী নির্মাতা এরকম আচরণ করবে বলে আশা করে না।
  • ইউনিট পরীক্ষাগুলি আরও শক্ত কারণ আপনি এই শ্রেণিটি তৈরি করতে বা এটি ইনজেক্ট করতে পারবেন না কারণ এটি কখনই লুপ থেকে বের হয় না।
  • লুপের শেষ (গেমের শেষ) তখন ধারণাগতভাবে সেই সময় যেখানে কনস্ট্রাক্টর শেষ হয়, যা বিজোড়ও।
  • প্রযুক্তিগতভাবে এই ধরণের শ্রেণীর নির্মাতা ব্যতীত কোনও সরকারী সদস্য নেই, এটি বুঝতে অসুবিধা হয় (বিশেষত এমন ভাষাগুলির জন্য যেখানে কোনও প্রয়োগ নেই)

এবং তারপরে প্রযুক্তিগত সমস্যাগুলি রয়েছে:

  • কনস্ট্রাক্টর আসলে কখনই শেষ হয় না, তাই এখানে জিসির সাথে কী ঘটে? এই অবজেক্টটি ইতিমধ্যে জেনার 0 তে রয়েছে?
  • বেস কন্সট্রাক্টর কখনই ফিরে না আসে এই কারণে এমন শ্রেণি থেকে ডাইভারিং অসম্ভব বা কমপক্ষে খুব জটিল

এরকম পদ্ধতির সাথে আরও স্পষ্টত খারাপ বা বিভ্রান্তিকর কিছু আছে কি?


61
কেন ভাল? আপনি যদি আপনার মূল লুপটি কোনও পদ্ধতিতে সরান (খুব সাধারণ রিফ্যাক্টরিং) তবে ব্যবহারকারী এই জাতীয় উদ্বেগজনক কোডটি লিখতে পারেন:var g = new Game {...}; g.MainLoop();
ব্র্যান্ডিন

61
আপনার প্রশ্নটি ইতিমধ্যে 6 টি কারণ এটি ব্যবহার না করার কারণ জানিয়েছে এবং আমি একটির পক্ষে এটির পক্ষে দেখতে চাই। এছাড়াও আপনি চাইতে পারেন কেন এটা একটা খারাপ ধারণা একটি লাগাতে while(true)একটি সম্পত্তি সেটার মধ্যে লুপ: new Game().RunNow = true?
গ্রো 13

38
চরম উপমা: আমরা কেন বলি যে হিটলার যা করেছিলেন তা ভুল ছিল? জাতিগত বৈষম্য বাদ, ডাব্লুডাব্লুআইআই শুরু করা, লক্ষ লক্ষ মানুষকে হত্যা, হিংসা [50+ অন্যান্য কারণে ইত্যাদি] তিনি কোনও ভুল করেন নি। নিশ্চিত যে আপনি কেন কিছু ভুল হিসাবে যুক্তিযুক্ত একটি তালিকা সরিয়ে ফেললে আপনি আক্ষরিক যে কোনও কিছুর জন্য সেই জিনিসটি ভাল বলেও শেষ করতে পারেন।
বাকুরিউ

4
আবর্জনা সংগ্রহের ক্ষেত্রে (জিসি) (আপনার প্রযুক্তিগত সমস্যা) এটি সম্পর্কে বিশেষ কিছু হবে না। কনস্ট্রাক্টর কোডটি আসলে চালানোর আগে উদাহরণটি উপস্থিত রয়েছে। এক্ষেত্রে উদাহরণটি এখনও পৌঁছনীয়, সুতরাং এটি জিসির দ্বারা দাবি করা যায় না। যদি জিসি সেট আপ করে, এই উদাহরণটি বেঁচে থাকবে এবং প্রতিটি সিসি ইন সিটিং স্থাপনের পরে অবজেক্টটি সাধারণ নিয়ম অনুসারে পরবর্তী প্রজন্মের কাছে প্রচার করা হবে। জিসি স্থান গ্রহণ করে কিনা তা নির্ভর করে (নতুন) নতুন বস্তু তৈরি হচ্ছে কিনা তা নির্ভর করে on
জেপ্পে স্টিগ নীলসন

8
আমি আরও এক ধাপ এগিয়ে যেতে চাই এবং এটি (সত্য) খারাপ যেখানে তা ব্যবহৃত হয় তা নির্বিশেষে বলব। এটি বোঝায় যে লুপটি থামানোর কোনও পরিষ্কার এবং পরিষ্কার উপায় নেই। আপনার উদাহরণস্বরূপ, গেমটি বেরিয়ে আসা বা ফোকাস হারিয়ে ফেললে লুপটি থামানো উচিত নয়?
জন অ্যান্ডারসন

উত্তর:


250

একজন কনস্ট্রাক্টরের উদ্দেশ্য কী? এটি একটি নতুন নির্মিত বস্তুটি ফেরত দেয়। অসীম লুপটি কী করে? এটি কখনই ফিরে আসে না। কনস্ট্রাক্টর যদি নতুনভাবে নির্মিত বস্তুটি একেবারেই না ফেরায় তবে কীভাবে তা ফিরিয়ে দিতে পারে? এটা পারে না।

এরগো, একটি অসীম লুপ কোনও নির্মাণকারীর মৌলিক চুক্তিটি ভেঙে দেয়: কোনও কিছু নির্মাণের জন্য।


11
সম্ভবত তারা মাঝখানে বিরতি দিয়ে যখন (সত্য) রাখা মানে? ঝুঁকিপূর্ণ, কিন্তু বৈধ।
জন ডিভোরাক

2
আমি সম্মত, এটি সঠিক - কমপক্ষে। একাডেমিক দৃষ্টিকোণ থেকে একই কিছু প্রতিটি ফাংশন ধরে রাখে যা কিছু ফেরত দেয়।
ডক ব্রাউন

61
দরিদ্র সোডের কল্পনা করুন যা এই শ্রেণীর একটি সাব-শ্রেণি তৈরি করে ...
নিউটোপিয়ান

5
@ জনডভোরাক: ঠিক আছে, এটি একটি আলাদা প্রশ্ন। ওপি স্পষ্টভাবে "কখনই শেষ হবে না" উল্লেখ করেছে এবং একটি ইভেন্টের লুপের কথা উল্লেখ করেছে।
জার্গ ডব্লু মিট্টাগ

4
@ জার্গডব্লিউমিত্যাগ ভাল, তবে, হ্যাঁ, এটি কোনও কনস্ট্রাক্টরে রাখবেন না।
জন ডিভোরাক

45

এরকম পদ্ধতির সাথে আরও স্পষ্টত খারাপ বা বিভ্রান্তিকর কিছু আছে কি?

হ্যা অবশ্যই. এটি অযৌক্তিক, অপ্রত্যাশিত, অকেজো, অবাস্তব। এটি ক্লাস ডিজাইনের আধুনিক ধারণাগুলি (সংহতি, সংযুক্তকরণ) লঙ্ঘন করে। এটি পদ্ধতির চুক্তি ভঙ্গ করে (কোনও নির্মাণকারীর একটি সংজ্ঞায়িত কাজ থাকে এবং এটি কেবল কিছু এলোমেলো পদ্ধতি নয়)। এটি অবশ্যই যথাযথভাবে রক্ষণাবেক্ষণযোগ্য নয়, ভবিষ্যতের প্রোগ্রামাররা কী চলছে তা বোঝার চেষ্টা করার জন্য এবং কেন সেভাবে এটি করা হয়েছিল তার কারণগুলি অনুমান করার জন্য প্রচুর সময় ব্যয় করবে।

আপনার কোডটি কাজ করে না এমন অর্থে এটির কোনও কিছুই "বাগ" নয়। তবে কোডটি বজায় রাখা (যেমন, পরীক্ষা যোগ করা শক্ত, পুনরায় ব্যবহার করা শক্ত, ডিবাগ করা শক্ত, প্রসারিত শক্ত ইত্যাদি) দীর্ঘমেয়াদে এটি দীর্ঘমেয়াদে প্রচুর মাধ্যমিক ব্যয় (প্রাথমিকভাবে কোড লেখার ব্যয়ের তুলনায়) বহন করবে will ।)।

সফ্টওয়্যার বিকাশের পদ্ধতিগুলিতে অনেকগুলি / আধুনিক উন্নতি বিশেষত সফ্টওয়্যার রাইটিং / টেস্টিং / ডিবাগিং / রক্ষণাবেক্ষণের আসল প্রক্রিয়াটিকে সহজ করার জন্য করা হয়। এই সমস্ত কিছুই এ জাতীয় স্টাফ দ্বারা পরিবেষ্টিত হয়, যেখানে কোড এলোমেলোভাবে স্থাপন করা হয় কারণ এটি "কাজ করে"।

দুর্ভাগ্যক্রমে, আপনি নিয়মিত প্রোগ্রামারদের সাথে দেখা করবেন যা এই সমস্ত বিষয় থেকে সম্পূর্ণ অজ্ঞ। এটি কাজ করে, এটি।

একটি সাদৃশ্যটি শেষ করার জন্য (অন্য প্রোগ্রামিং ভাষা, এখানে সমস্যাটি গণনার জন্য রয়েছে 2+2):

$sum_a = `bash -c "echo $((2+2)) 2>/dev/null"`;   # calculate
chomp $sum_a;                         # remove trailing \n
$sum_a = $sum_a + 0;                  # force it to be a number in case some non-digit characters managed to sneak in

$sum_b = 2+2;

প্রথম পদ্ধতির সাথে কী ভুল? এটি যুক্তিসঙ্গত স্বল্প সময়ের পরে 4 ফিরে আসে; এটা সঠিক. আপত্তি (একসাথে বিকাশকারী তাদের খণ্ডন করতে পারে এমন সমস্ত সাধারণ কারণের সাথে একত্রে):

  • পড়া শক্ত (তবে ওহে, একজন ভাল প্রোগ্রামার সহজেই এটি পড়তে পারে, এবং আমরা সবসময় এটি এরকম করে দিয়েছি; আপনি যদি চান তবে আমি এটি একটি পদ্ধতিতে রিফ্যাক্টর করতে পারি!)
  • ধীরে ধীরে (তবে এটি সময়সাপেক্ষ সমালোচনামূলক জায়গায় নয় তাই আমরা এটিকে উপেক্ষা করতে পারি এবং ততক্ষণ কেবল প্রয়োজনীয় হলে অপ্টিমাইজ করা ভাল!)
  • আরও অনেক রিসোর্স ব্যবহার করে (একটি নতুন প্রক্রিয়া, আরও র্যাম ইত্যাদি - তবে ডিটো, আমাদের সার্ভারটি যথেষ্ট দ্রুতগতির চেয়ে বেশি)
  • এর উপর নির্ভরশীলতার পরিচয় দেয় bash(তবে এটি উইন্ডোজ, ম্যাক বা অ্যান্ড্রয়েডে কখনই চলবে না)
  • এবং উপরে উল্লিখিত অন্যান্য সমস্ত কারণ।

5
"জিসি কোনও কনস্ট্রাক্টর চালানোর সময় কিছু ব্যতিক্রমী লকিং অবস্থায় থাকতে পারে" - কেন? বরাদ্দকারী প্রথমে বরাদ্দ দেয়, তারপরে কনস্ট্রাক্টরটিকে একটি সাধারণ পদ্ধতি হিসাবে চালু করে। এটি সম্পর্কে সত্যিই বিশেষ কিছু নেই, আছে কি? এবং বরাদ্দকারীকে যে কোনও উপায়ে নির্মাণকারীর মধ্যে নতুন বরাদ্দ (এবং এগুলি OOM পরিস্থিতিগুলিকে ট্রিগার করতে পারে) অনুমতি দিতে হবে।
জন ডিভোরাক

1
@ জানডভোরাক, কেবল এই বিষয়টিই তৈরি করতে চেয়েছিলেন যে নির্মাতারা থাকাকালীন "কোথাও" কিছু বিশেষ আচরণ থাকতে পারে, তবে আপনি সঠিক, আমি যে উদাহরণটি বেছে নিয়েছি তা অবাস্তব ছিল। সরানো হয়েছে।
আনোই

আমি আপনার ব্যাখ্যাটি সত্যই পছন্দ করি এবং উভয় জবাব উত্তর হিসাবে চিহ্নিত করতে চাই (কমপক্ষে একটি উর্ধ্বতন রয়েছে)। সাদৃশ্যটি দুর্দান্ত এবং আপনার চিন্তাভাবনা এবং গৌণ ব্যয়ের ব্যাখ্যা এর ট্রেইল খুব তা কিন্তু আমি এগুলিকে কোডের জন্য সহায়ক প্রয়োজনীয়তা হিসাবে বিবেচনা করি (আমার যুক্তিগুলির মতো)। শিল্পের বর্তমান অবস্থা কোডটি পরীক্ষা করা, অতএব টেস্টাবিলিটি ইত্যাদি হ'ল একটি ডি-ফ্যাক্টোর প্রয়োজনীয়তা। তবে @ জার্গডব্লিউমিতাগের বক্তব্য fundamental contract of a constructor: to construct somethingস্পষ্ট।
স্যামুয়েল

উপমাটি এতটা ভাল নয়। আমি যদি এটি দেখি তবে আপনি কেন গণিত করতে বাশকে ব্যবহার করছেন তা নিয়ে কোথাও একটি মন্তব্য দেখার আশা করব এবং আপনার কারণের উপর নির্ভর করে এটি সম্পূর্ণ জরিমানা হতে পারে। এটি ওপি-তে কাজ করবে না, কারণ আপনি নির্ধারককে যে কোনও জায়গায় ব্যবহার করার জন্য মূলত আপনাকে মন্তব্যে ক্ষমা চাইতে হবে "// দ্রষ্টব্য: এই অবজেক্টটি তৈরি করা এমন ইভেন্ট লুপ শুরু করে যা কখনই ফিরে আসে না"।
ব্র্যান্ডিন

4
"দুর্ভাগ্যক্রমে, আপনি নিয়মিত প্রোগ্রামারদের সাথে দেখা করবেন যা এই সমস্ত বিষয় সম্পর্কে সম্পূর্ণ অজ্ঞ nt এটি কাজ করে, এটিই।" খুব দুঃখজনক হলেও সত্য true আমি মনে করি যখন আমি বলি আমাদের পেশাগত জীবনে একমাত্র যথেষ্ট বোঝা হ'ল, সেই লোকগুলি us
মনিকার সাথে লাইটনেস রেস

8

আপনি এই পদ্ধতির বাইরে যাওয়ার জন্য আপনার প্রশ্নে যথেষ্ট কারণ দিয়েছেন তবে এখানে আসল প্রশ্নটি "এই ধরণের পদ্ধতির সাথে আরও স্পষ্টত খারাপ বা বুদ্ধিমান কিছু আছে কি?"

আমার প্রথম যদিও এখানে ছিল যে এটি অর্থহীন। আপনার কন্সট্রাকটর কখনো শেষ, তাহলে প্রোগ্রাম অন্য কোন অংশ একটি রেফারেন্স পেতে পারেন নির্মাণ কি একটি কন্সট্রাকটর পরিবর্তে একটি নিয়মিত পদ্ধতি এটি নির্বাণ যৌক্তিকতা তাই অবজেক্ট। তারপরে এটি আমার কাছে ঘটেছিল যে পার্থক্যটি হ'ল কেবলমাত্র আপনার লুপে আপনি রেফারেন্সগুলি thisলুপ থেকে আংশিকভাবে নির্মিত পলায়নের অনুমতি দিতে পারবেন । যদিও এটি এই পরিস্থিতিটির মধ্যে কঠোরভাবে সীমাবদ্ধ নয়, এটি গ্যারান্টিযুক্ত যে আপনি যদি thisপালানোর অনুমতি না দিয়ে থাকেন তবে re উল্লেখগুলি সর্বদা সম্পূর্ণরূপে নির্মিত না এমন কোনও সামগ্রীর দিকে নির্দেশ করবে not

আমি জানি না যে এই ধরণের পরিস্থিতি সম্পর্কে শব্দার্থবিজ্ঞানগুলি সি # তে ভালভাবে সংজ্ঞায়িত হয়েছে কিনা তবে আমি যুক্তি দিয়ে বলব যে এটি কোনও বিষয় নয় কারণ বেশিরভাগ বিকাশকারী এটি আবিষ্কার করার চেষ্টা করতে চান এমন কিছু নয়।


আমি ধরে নেব যে কনস্ট্রাক্টরটি চালিত হওয়ার পরে অবজেক্টটি তৈরি হওয়ার পরে এইভাবে একটি বুদ্ধিমান ভাষায় ফাঁস হওয়া উচিত এটি নির্ভুলভাবে সংজ্ঞায়িত আচরণ হওয়া উচিত।
ম্রোমান

@ ম্রোমান: কনস্ট্রাক্টরটিতে ফাঁস হওয়া ঠিক হবে this- তবে আপনি যদি সর্বাধিক উদ্ভূত শ্রেণির নির্মাতা হন । আপনার যদি দুটি ক্লাস থাকে Aএবং এর Bসাথে B : A, যদি কনস্ট্রাক্টর Aফাঁস হয়ে যায় thisতবে এর সদস্যরা Bঅবিচ্ছিন্ন হয়ে যাবে (এবং ভার্চুয়াল পদ্ধতিতে কল বা ক্যাসেটগুলি তার Bভিত্তিতে বিপর্যয় ডেকে আনতে পারে)।
হাফমেল

1
আমি সি ++ তে অনুমান করি যা পাগল হতে পারে, হ্যাঁ। অন্যান্য ভাষায় সদস্যরা তাদের প্রকৃত মান নির্ধারিত হওয়ার আগে একটি ডিফল্ট মান অর্জন করে তবে এই জাতীয় কোডটি লিখতে বোকামি আচরণটি এখনও ভালভাবে সংজ্ঞায়িত। যদি আপনি এই পদ্ধতিগুলিকে কল করেন যা এই সদস্যদের ব্যবহার করে আপনি নলপয়েন্টারএক্সেপশন বা ভুল গণনাতে দৌড়াতে পারেন (কারণ সংখ্যাগুলি 0-এ ডিফল্ট হয়) বা এর মতো স্টাফ হয় তবে কী হয় তা প্রযুক্তিগতভাবে নির্বিচারক।
ম্রোমান

@ ম্রোমান আপনি কি সিএলআর সম্পর্কিত একটি নির্দিষ্ট রেফারেন্স খুঁজে পেতে পারেন যা দেখায় যে বিষয়টি হবে?
জিমি জেমস

কনস্ট্রাক্টর চালুর আগে আপনি সদস্যদের মানগুলি নির্ধারণ করতে পারেন যাতে অবজেক্টটি বৈধ অবস্থায় উপস্থিত সদস্যদের ডিফল্ট মান নির্ধারিত বা কন্সট্রাক্টর চালনার আগে তাদের নির্ধারিত মানগুলির সাথে উপস্থিত থাকে। সদস্যদের আরম্ভ করার জন্য আপনার কনস্ট্রাক্টরের দরকার নেই। ডক্সে আমি কোথাও এটি খুঁজে পেতে পারি কিনা তা আমাকে দেখতে দিন।
ম্রোমান

1

+1 অন্তত বিস্মিত হওয়ার জন্য, তবে নতুন ডেভসকে বোঝাতে এটি একটি শক্ত ধারণা। ব্যবহারিক স্তরে, কনস্ট্রাক্টরগুলির মধ্যে উত্থাপিত ব্যতিক্রমগুলি ডিবাগ করা শক্ত, যদি বস্তুটি আরম্ভ করতে ব্যর্থ হয় তবে আপনার পক্ষে সেই নির্মাণকারীর অবস্থার নিরীক্ষণ করতে বা লগ করতে আপনার অস্তিত্ব থাকবে না।

আপনি যদি এই ধরণের কোড প্যাটার্নটি করার প্রয়োজন বোধ করেন তবে ক্লাসে স্থির পদ্ধতিগুলি পরিবর্তে ব্যবহার করুন।

শ্রেণীর সংজ্ঞা থেকে যখন কোনও বস্তু ইনস্ট্যান্ট করা হয় তখন আরম্ভের যুক্তি সরবরাহ করার জন্য একটি নির্মাণকারীর উপস্থিতি রয়েছে। আপনি এই অবজেক্টের উদাহরণটি তৈরি করেন কারণ এটি এমন একটি ধারক যা বৈশিষ্ট্য এবং কার্যকারিতার একটি সেটকে আপনার অ্যাপ্লিকেশন যুক্তির বাকী অংশ থেকে কল করতে ইচ্ছুক।

আপনি যদি "নির্মাণ" করছেন এমন বস্তুটি ব্যবহার করার ইচ্ছা না রাখেন তবে প্রথম স্থানে বস্তুটি তাত্ক্ষণিকভাবে বলার কী আছে? কোনও কনস্ট্রাক্টরে কার্যকরভাবে কিছুক্ষণ (সত্য) লুপ থাকা মানে আপনি কখনই এটির কাজ শেষ করার ইচ্ছা করেন না ...

সি # হ'ল একটি খুব সমৃদ্ধ অবজেক্ট ওরিয়েন্টেড ভাষা যা আপনাকে এক্সপ্লোর করার জন্য, আপনার সরঞ্জামগুলি জানতে এবং সেগুলি কখন ব্যবহার করতে হবে তা নীচের লাইন:

সি # তে কনস্ট্রাক্টরগুলির মধ্যে বর্ধিত বা কখনও শেষ না হওয়া যুক্তিগুলি কার্যকর করবেন না কারণ ... আরও ভাল বিকল্প রয়েছে


1
তার 9 টি উত্তর পূর্বের উত্তরগুলিতে তৈরি এবং ব্যাখ্যা করা হয়েছে তার চেয়ে বেশি কিছু সরবরাহ করার মতো বলে মনে হচ্ছে না
gnat

1
আরে, আমাকে এদিকে যেতে হবে :) আমি ভেবেছিলাম যে এটি হাইলাইট করা গুরুত্বপূর্ণ ছিল যেহেতু এটি করার বিরুদ্ধে কোনও নিয়ম না থাকলেও আপনার সহজ উপায় নেই যে সহজ উপায় আছে of বেশিরভাগ অন্যান্য প্রতিক্রিয়াগুলি কেন খারাপ এটির প্রযুক্তিগততার দিকে মনোনিবেশ করে, তবে এমন কোনও নতুন দেবের কাছে বিক্রি করা শক্ত যারা বলে "তবে এটি সংকলন করে, তাই আমি কেবল এটিকেই ছেড়ে দিতে পারি"
ক্রিস শ্যাচালার

0

এ সম্পর্কে সহজাত খারাপ কিছু নেই nothing যাইহোক, কী গুরুত্বপূর্ণ হবে তা হ'ল আপনি কেন এই নির্মাণটি ব্যবহার করতে বেছে নিয়েছেন question এটি করে আপনি কী পেয়েছেন?

প্রথমে, আমি while(true)কোনও কনস্ট্রাক্টর ব্যবহার করার বিষয়ে কথা বলব না । নেই একেবারে একটি কন্সট্রাকটর যে সিনট্যাক্স ব্যবহার করে কিছুই ভুল। তবে, "কনস্ট্রাক্টরে একটি গেম লুপ শুরু করা" ধারণাটি এমন একটি যা কিছু সমস্যার কারণ হতে পারে।

এই পরিস্থিতিতে কন্সট্রাক্টর কেবল অবজেক্টটি তৈরি করা এবং অসীম লুপকে কল করে এমন একটি ফাংশন থাকা খুব সাধারণ বিষয়। এটি আপনার কোড ব্যবহারকারীকে আরও নমনীয়তা দেয়। বিভিন্ন ধরণের সমস্যাগুলির উদাহরণ হিসাবে দেখাতে পারে যে আপনি নিজের অবজেক্টের ব্যবহারকে সীমাবদ্ধ করছেন। যদি কেউ কোনও সদস্যের অবজেক্ট রাখতে চান যা তাদের ক্লাসে "গেম অবজেক্ট" হয় তবে তাদের নির্মাণকারীকে পুরো গেম লুপটি চালানোর জন্য প্রস্তুত থাকতে হবে কারণ তাদের অবজেক্টটি নির্মাণ করতে হবে। এটি এটিকে ঘিরে কাজ করার জন্য নির্যাতনের কোডিং হতে পারে। সাধারণ ক্ষেত্রে, আপনি আপনার গেম অবজেক্টটিকে প্রাক-বরাদ্দ করতে পারবেন না এবং তারপরে এটি চালান। কিছু প্রোগ্রামের জন্য এটি কোনও সমস্যা নয়, তবে এমন কিছু প্রোগ্রাম রয়েছে যেখানে আপনি সামনে সবকিছু বরাদ্দ করতে এবং তারপরে গেম লুপটি কল করতে সক্ষম হতে চান।

প্রোগ্রামিংয়ে থাম্বের একটি নিয়ম হ'ল কাজের জন্য সবচেয়ে সহজ সরঞ্জামটি ব্যবহার করা। এটি কোনও কঠোর এবং দ্রুত নিয়ম নয়, তবে এটি একটি খুব কার্যকর। যদি একটি ফাংশন কল যথেষ্ট হত, তবে একটি শ্রেণি অবজেক্ট কেন নির্মাণকে বিরক্ত করবেন? যদি আমি আরও শক্তিশালী জটিল সরঞ্জাম ব্যবহৃত দেখি, তবে আমি অনুমান করি যে বিকাশকারীটির এর কোনও কারণ ছিল এবং আমি কী ধরণের বিজোড় কৌশলগুলি করছিলাম তা অন্বেষণ করা শুরু করব।

এমন কিছু ঘটনা রয়েছে যেখানে এটি যুক্তিসঙ্গত হতে পারে। এমন কেস থাকতে পারে যেখানে কনস্ট্রাক্টরটিতে গেম লুপ থাকা আপনার পক্ষে সত্যই স্বজ্ঞাত। এই ক্ষেত্রে, আপনি এটি সঙ্গে চালানো! উদাহরণস্বরূপ, আপনার গেম লুপটি আরও বৃহত্তর প্রোগ্রামে এম্বেড হতে পারে যা কিছু ডেটা মূর্ত করার জন্য ক্লাস তৈরি করে। আপনাকে যদি সেই ডেটা তৈরি করতে গেম লুপ চালাতে হয় তবে কোনও কনস্ট্রাক্টরে গেম লুপটি চালানো খুব যুক্তিসঙ্গত হতে পারে। এটি কেবল একটি বিশেষ কেস হিসাবে বিবেচনা করুন: এটি করা বৈধ হবে কারণ অতিরিক্ত কর্মসূচি পরবর্তী বিকাশকারীকে আপনি কী এবং কেন করেছেন তা বোঝার জন্য এটি স্বজ্ঞাত করে তোলে।


যদি আপনার অবজেক্টটি তৈরির জন্য গেম লুপের প্রয়োজন হয় তবে কমপক্ষে এটির পরিবর্তে একটি কারখানার পদ্ধতিতে রাখুন। GameTestResults testResults = runGameTests(tests, configuration);বরং GameTestResults testResults = new GameTestResults(tests, configuration);
ব্যবহারকারী 253751

@ মিম্বিস হ্যাঁ, এটি সত্য, যেখানে মামলাগুলি অযৌক্তিক except যদি আপনি একটি প্রতিবিম্ব ভিত্তিক সিস্টেমের সাথে কাজ করছেন যা আপনার জন্য আপনার অবজেক্টকে তাত্ক্ষণিক করে তোলে, আপনি কারখানার পদ্ধতি তৈরি করার বিকল্প নাও পেতে পারেন।
কর্ন

0

আমার ধারণাটি হল যে কিছু ধারণাগুলি মিশে গেছে এবং ফলস্বরূপ একটি খুব ভাল শব্দযুক্ত প্রশ্নের জন্ম দিয়েছে।

একটি বর্গ প্রস্ততকর্তার একটি নতুন থ্রেড শুরু হতে পারে যা হবে "কখনো না" শেষ (আমি ব্যবহার করতে পছন্দ যদিও while(_KeepRunning)উপর while(true)কারণ আমি মিথ্যা কোথাও বুলিয়ান সদস্য সেট করতে পারেন)।

আপনি থ্রেডটি তৈরি এবং এটির নিজস্ব কার্যক্রমে সূচনা করার পদ্ধতিটি নিষ্ক্রিয় করতে পারেন, বস্তুর নির্মাণ এবং এর কাজটির প্রকৃত সূচনা পৃথক করার জন্য - আমি এই উপায়ে পছন্দ করি কারণ আমি সংস্থানগুলিতে অ্যাক্সেসের উপর আরও ভাল নিয়ন্ত্রণ পেতে পারি।

আপনি "অ্যাক্টিভ অবজেক্ট প্যাটার্ন" এ একবার দেখতে পারেন। শেষ পর্যন্ত, আমি অনুমান করি যে প্রশ্নটি কখন একটি "অ্যাক্টিভ অবজেক্ট" এর থ্রেডটি শুরু করতে হবে এবং আমার পছন্দটি নির্মাণের ডি-কাপলিং এবং আরও ভাল নিয়ন্ত্রণের জন্য শুরু করা।


0

আপনার অবজেক্টটি আমাকে টাস্ক শুরু করার কথা মনে করিয়ে দেয় । কাজের বস্তুর একটি কন্সট্রাকটর আছে, কিন্তু এটা এছাড়াও আছে মত স্ট্যাটিক কারখানা পদ্ধতি একটি গুচ্ছ আছে: Task.Run, Task.Startএবং Task.Factory.StartNew

এগুলি আপনি যা করার চেষ্টা করছেন তার সাথে খুব মিল এবং সম্ভবত এটিই 'সম্মেলন'। লোকেদের কাছে যে মুখ্য বিষয়টি মনে হয় তারা হ'ল কোনও কনস্ট্রাক্টরের এই ব্যবহার তাদের অবাক করে দেয়। @ জার্গডব্লিউমিত্যাগ বলেছেন যে এটি একটি মৌলিক চুক্তি ভঙ্গ করে , যার অর্থ আমার মনে হয় জার্গ খুব অবাক হয়েছেন। আমি সম্মত এবং এর সাথে যুক্ত করার মতো আর কিছুই আমার কাছে নেই।

তবে, আমি পরামর্শ দিতে চাই যে ওপি স্থিতিশীল কারখানার পদ্ধতিগুলি চেষ্টা করে। আশ্চর্য বিলুপ্ত হয়ে যায় এবং এখানে কোনও মৌলিক চুক্তি ঝুঁকিতে নেই। লোকেরা বিশেষ কাজ করে স্থিতিশীল কারখানার পদ্ধতিতে অভ্যস্ত এবং সে অনুসারে তাদের নাম দেওয়া যায়।

আপনি এমন কন্সট্রাক্টর সরবরাহ করতে পারেন যা সূক্ষ্ম দানাদার নিয়ন্ত্রণের অনুমতি দেয় (যেমন ব্র্যান্ডিনের পরামর্শ অনুসারে, এমন কিছু var g = new Game {...}; g.MainLoop();ব্যবহারকারীদের সামঞ্জস্য করুন যারা গেমটি তাত্ক্ষণিকভাবে শুরু করতে চান না এবং সম্ভবত প্রথমে এটি পাস করতে চান And এবং আপনি var runningGame = Game.StartNew();শুরু করার মতো কিছু লিখতে পারেন এটি অবিলম্বে সহজ।


এর অর্থ জের্গ মৌলিকভাবে অবাক, যার অর্থ একটি সারপ্রাইজ বলতে মূলত ব্যথা হয়।
স্টিভ জেসোপ

0

কনস্ট্রাক্টরের কিছুক্ষণ (সত্য) লুপটি আসলে খারাপ কেন?

মোটেও খারাপ নয়।

কেন (বা এটি আদৌ?) শ্রেণীর একজন নির্মাতাকে কখনও শেষ না হওয়া লুপ (অর্থাত্ গেম লুপ) শুরু করতে খারাপ নকশা হিসাবে বিবেচনা করা হয়?

আপনি কেন কখনও এটি করতে চান? সিরিয়াসলি। এই শ্রেণীর একটি ফাংশন রয়েছে: নির্মাণকারী। যদি আপনি চান সমস্ত একটি একক ফাংশন হয়, এজন্য আমাদের ফাংশন আছে, কনস্ট্রাক্টর নয়।

আপনি নিজেই এর বিরুদ্ধে কিছু স্পষ্ট কারণ উল্লেখ করেছেন তবে আপনি সবচেয়ে বড়টি এড়িয়ে গেছেন:

একই জিনিস অর্জনের জন্য আরও ভাল এবং সহজ বিকল্প রয়েছে।

যদি 2 টি পছন্দ থাকে এবং একটি ভাল হয় তবে এটি কতটা ভাল তা বিবেচনাধীন নয়, আপনি আরও ভালটি বেছে নিয়েছেন। ঘটনাচক্রে, এ কারণেই আমরা প্রায়শই গো-টো ব্যবহার করি না


-1

একজন কনস্ট্রাক্টরের উদ্দেশ্য হ'ল আপনার অবজেক্টটি ভালভাবে তৈরি করা। কনস্ট্রাক্টরটি সম্পন্ন হওয়ার আগে নীতিগতভাবে সেই অবজেক্টের কোনও পদ্ধতি ব্যবহার করা নিরাপদ নয়। অবশ্যই আমরা কনস্ট্রাক্টরের মধ্যে অবজেক্টের পদ্ধতিগুলি কল করতে পারি, তবে তারপরে প্রতিবার এটি করার সময় আমাদের নিশ্চিত করতে হবে যে এটি করা তার বর্তমান অর্ধ-বেকড অবস্থায় অবজেক্টের জন্য বৈধ কিনা is

পরোক্ষভাবে সমস্ত যুক্তি নির্মাণকারীর মধ্যে রেখে, আপনি নিজের উপর এই ধরণের আরও বোঝা যুক্ত করেন add এটি প্রস্তাব দেয় যে আপনি আরম্ভের মধ্যে পার্থক্যটি ডিজাইন করেননি এবং যথেষ্ট পরিমাণে ব্যবহার করেছেন।


1
এটি 8 টি পূর্ব উত্তরগুলিতে তৈরি এবং ব্যাখ্যা করা পয়েন্টগুলির চেয়ে বেশি কিছু দেওয়ার প্রস্তাব দিচ্ছে না
gnat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.