সময়ের উল্লেখযোগ্য পরিমাণে, আমি স্থির শ্রেণীর পরিবর্তে কোনও বস্তু থাকার কারণ সম্পর্কে ভাবতে পারি না। আমার কি মনে হয় তার চেয়ে বেশি কি উপায়ে সুবিধা রয়েছে? [বন্ধ]


9

আমি কোনও অবজেক্টের ধারণাটি বুঝতে পারি এবং একটি জাভা প্রোগ্রামার হিসাবে আমি অনুভব করি যে ওও দৃষ্টান্তটি প্রাকৃতিকভাবে আমার কাছে প্রাকৃতিকভাবে আসে।

তবে সম্প্রতি আমি নিজেকে ভাবতে দেখেছি:

এক সেকেন্ড অপেক্ষা করুন, স্থির শ্রেণি ব্যবহারের উপর কোনও বস্তু ব্যবহারের (যথাযথ এনক্যাপসুলেশন এবং ওও অনুশীলন সহ) আসলে ব্যবহারিক সুবিধা কী?

আমি কোনও বস্তু ব্যবহারের দুটি সুবিধা সম্পর্কে ভাবতে পারি (উভয়ই তাৎপর্যপূর্ণ এবং শক্তিশালী):

  1. পলিমারফিজম: রানটাইম চলাকালীন আপনাকে গতিশীল এবং নমনীয়ভাবে কার্যকারিতা অদলবদল করতে দেয়। এছাড়াও সহজেই নতুন কার্যকারিতা 'যন্ত্রাংশ' এবং সিস্টেমে বিকল্প যুক্ত করতে দেয়। উদাহরণস্বরূপ, যদি কোনও Carশ্রেণি Engineঅবজেক্টগুলির সাথে কাজ করার জন্য নকশাকৃত হয় এবং আপনি গাড়িটি যে সিস্টেমে ব্যবহার করতে পারেন তার জন্য একটি নতুন ইঞ্জিন যুক্ত করতে চান, আপনি একটি নতুন Engineউপক্লাস তৈরি করতে পারেন এবং কেবল এই শ্রেণীর কোনও অবজেক্টকে অবজেক্টে পাস Carকরতে পারেন to সম্পর্কে কিছু পরিবর্তন Car। এবং রানটাইমের সময় আপনি এটি করার সিদ্ধান্ত নিতে পারেন।

  2. 'চারপাশে কার্যকারিতা পাস' করতে সক্ষম হওয়া: আপনি সিস্টেমের চারপাশে কোনও বস্তুকে গতিময়ভাবে পাস করতে পারেন।

কিন্তু স্থির শ্রেণীর চেয়ে বেশি কোনও কিছুর সুবিধা রয়েছে?

প্রায়শই যখন আমি কোনও সিস্টেমে নতুন 'যন্ত্রাংশ' যুক্ত করি, তখন আমি একটি নতুন শ্রেণি তৈরি করে এবং এটি থেকে অবজেক্টগুলি ইনস্ট্যান্ট করেই করি।

তবে সম্প্রতি যখন আমি থেমেছি এবং এটি সম্পর্কে চিন্তাভাবনা করেছি, তখন বুঝতে পেরেছিলাম যে একটি স্থির শ্রেণি যেখানে আমি সাধারণত কোনও বস্তু ব্যবহার করি সেখানে প্রচুর স্থানে একটি অবজেক্টের মতোই একই কাজ করবে।

উদাহরণস্বরূপ, আমি আমার অ্যাপে একটি সেভ / লোড-ফাইল প্রক্রিয়া যুক্ত করার কাজ করছি।

কোনও অবজেক্টের সাথে কোডিং কলিং লাইনটি দেখতে পাবেন: Thing thing = fileLoader.load(file);

একটি স্ট্যাটিক বর্গ সহ, এটি দেখতে এটির মতো হবে: Thing thing = FileLoader.load(file);

পার্থক্য কি?

প্রায়শই আমি যখন কোনও সাধারণ-পুরাতন স্ট্যাটিক-শ্রেণীর ঠিক একই রকম আচরণ করি তখন কোনও বস্তুকে তদন্ত করার কারণ সম্পর্কে আমি ভাবতে পারি না। তবে ওও সিস্টেমে স্থির ক্লাসগুলি মোটামুটি বিরল। সুতরাং আমি অবশ্যই কিছু মিস করছি।

আমি তালিকাভুক্ত দুটি থেকে অন্য বস্তুর আরও কি সুবিধা আছে? দয়া করে ব্যাখ্যা করুন.

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

সুরগুলিও বস্তু ছিল, যেহেতু এগুলি চারপাশে পাস করা কার্যকর। তীর এবং আঁশ ছিল।

কিন্তু সিস্টেমের 'স্ট্যাটিক' অংশগুলির কী - যেগুলি প্রায় পাস হবে না? উদাহরণস্বরূপ - একটি 'সেভ ফাইল' প্রক্রিয়া। আমি কেন এটি কোনও স্থিতিক শ্রেণিতে নয়, কোনও বস্তুতে প্রয়োগ করব?


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

আপনি যখন FileLoaderসকেট থেকে পড়া একটি জন্য আপনার অদলবদল প্রয়োজন যখন কি হবে ? নাকি পরীক্ষার জন্য একটি উপহাস? বা একটি জিপ ফাইল খুলবে?
বেনিয়ামিন হডসন


1
@ ডেলানন ওকে, আমি একটি প্রশ্ন বের করেছি যা উত্তর আমাকে বুঝতে সাহায্য করবে: আপনি কেন একটি অবিচলিত সিস্টেমের অংশটিকে অবজেক্ট হিসাবে প্রয়োগ করবেন? প্রশ্নের উদাহরণটির মতো: একটি সেভ-ফাইল প্রক্রিয়া। কোনও বস্তুতে এটি প্রয়োগ করে আমি কী লাভ করব?
আভিভ কোহন

1
ডিফল্টটি একটি অ স্থির অবজেক্ট ব্যবহার করা উচিত। আপনি যদি মনে করেন যে এটি আপনার উদ্দেশ্যকে আরও ভালভাবে প্রকাশ করে তবেই স্থির শ্রেণি ব্যবহার করুন। System.Mathইন। নেট এমন একটি উদাহরণ যা স্থির শ্রেণীর হিসাবে অনেক বেশি অর্থবোধ করে: এটি আপনাকে কখনই বদলাতে বা উপহাস করার দরকার পড়বে না এবং অপারেশনগুলির কোনওটিকেই যৌক্তিকভাবে উদাহরণের অংশ হিসাবে তৈরি করা যায়নি। আপনার 'সঞ্চয়' উদাহরণটি এই বিলটির সাথে খাপ খায় বলে আমি সত্যিই মনে করি না।
বেনিয়ামিন হজসন

উত্তর:


14

আপনারা এমন একটি দলের মতো শোনেন যেটিতে আমি কাজ করতাম;)

জাভা (এবং সম্ভবত সি #) অবশ্যই সেই প্রোগ্রামিং শৈলীর সমর্থন করে। এবং আমি এমন লোকদের সাথে কাজ করি যারা প্রথম প্রবৃত্তিটি হ'ল, "আমি এটি একটি স্থির পদ্ধতি তৈরি করতে পারি!" তবে কিছু সূক্ষ্ম ব্যয় রয়েছে যা সময়ের সাথে সাথে আপনার সাথে জুড়ে।

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

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

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

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

3) ইন্টারফেস জাভা অন্যতম শক্তিশালী বৈশিষ্ট্য। শ্রেণীর উত্তরাধিকার সমস্যাযুক্ত হিসাবে প্রমাণিত হয়েছে, তবে ইন্টারফেসের সাথে প্রোগ্রামিং করা ভাষার অন্যতম শক্তিশালী কৌশল remains (ডিটো সি #) অল-স্ট্যাটিক ক্লাসগুলি সে মডেলটিতে নিজেকে রাখতে পারে না।

4) এটি গুরুত্বপূর্ণ ওও কৌশলগুলির দরজাটি স্ল্যাম করে যা আপনি নিতে পারেন না। সুতরাং আপনি যদি আপনার স্ক্রু ড্রাইভারও পেয়ে থাকেন তবে কত সহজ জিনিস হত তা উপলব্ধি না করেই আপনি আপনার সরঞ্জামবক্সে কেবল একটি হাতুড়ি দিয়ে বছরের পর বছর ধরে কাজ করতে পারেন।

৪.৪) এটি সম্ভবতম, সবচেয়ে অবিচ্ছেদ্য সংকলন-সময় নির্ভরতা তৈরি করে। সুতরাং, উদাহরণস্বরূপ যদি আপনার কাছে থাকে FileSystem.saveFile()তবে তা পরিবর্তন করার কোনও উপায় নেই, রান সময়টিতে আপনার জেভিএমকে ফাঁকা করে নেওয়া short যার অর্থ আপনার স্ট্যাটিক ফাংশন শ্রেণির রেফারেন্সের প্রতিটি বর্গের সেই নির্দিষ্ট বাস্তবায়নের উপর একটি কঠোর, সংকলন-সময় নির্ভরতা রয়েছে, যা সম্প্রসারণকে প্রায় অসম্ভব করে তোলে এবং প্রচুর পরীক্ষায় জটিল করে তোলে। আপনি স্ট্যাটিক ক্লাসকে বিচ্ছিন্নভাবে পরীক্ষা করতে পারেন, তবে ক্লাসগুলি পরীক্ষা করা খুব কঠিন হয়ে যায় যে ক্লাসটি বিচ্ছিন্নতার সাথে উল্লেখ করে।

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

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

আরেকটি কৌশলটি হ'ল কোনও ভাষা খারাপভাবে ব্যবহার করা এবং তারা এর ফলে সৃষ্ট সমস্ত সমস্যা সম্পর্কে অভিযোগ করে। কিন্তু এটি প্রায় কোনও প্রযুক্তির ক্ষেত্রে প্রযোজ্য।

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

যদিও এটি একটি কঠিন। আমি লোকদের "সমস্ত স্থির" বাগ পেতে দেখেছি এবং এগুলির বাইরে কথা বলা একরকম কঠিন। তবে আমি যখন দেখেছি যে তারা এগুলি পেরেছেন তখন তাদের কাছে স্বস্তির এক বৃহত্তর ধারণা রয়েছে।


আপনি প্রধানত জিনিসগুলি ছোট এবং মডিউলার রাখার বিষয়ে এবং রাষ্ট্র এবং কার্যকারিতা এক সাথে রাখার বিষয়ে কথা বলেন। স্ট্যাটিক ক্লাসের সাথে এটি করতে আমাকে থামায় এমন কিছুই নেই। তারা রাষ্ট্র থাকতে পারে। এবং আপনি গিটার-সেটারগুলির সাথে এগুলি আবদ্ধ করতে পারেন। এবং আপনি সিস্টেমে ক্ষুদ্র ক্লাসগুলিতে বিভক্ত করতে পারেন যা কার্যকারিতা এবং রাজ্যকে encapsulate করে। এই সমস্ত ক্লাস এবং অবজেক্ট উভয় ক্ষেত্রেই প্রযোজ্য। এবং এটি হ'ল আমার দ্বিধা: বলুন আমি আমার অ্যাপে নতুন কার্যকারিতা যুক্ত করছি। স্পষ্টতই এটি এসআরপি মানার জন্য একটি পৃথক শ্রেণিতে যাবে। তবে কেন আমি ঠিক এই ক্লাসটি ইনস্ট্যান্ট করব? এটি আমি বুঝতে পারি না।
আভিভ কোহন

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

স্থিতিশীল পদ্ধতি সহ একটি শ্রেণীর তার রাষ্ট্রকে বহিরাগত করতে হয়। যা কখনও কখনও খুব গুরুত্বপূর্ণ ফ্যাক্টরিং কৌশল। তবে বেশিরভাগ সময় আপনি রাষ্ট্রকে encapsulate করতে চান। একটি দৃ concrete় উদাহরণ: বছর আগে সহকর্মী জাভাস্ক্রিপ্টে একটি "তারিখ চয়নকারী" লিখেছিলেন। এবং এটি একটি দুঃস্বপ্ন ছিল। গ্রাহকরা নিয়মিত এটি সম্পর্কে অভিযোগ করেছিলেন। সুতরাং আমি এটিকে "ক্যালেন্ডার" অবজেক্টগুলিতে রিফ্যাক্ট করেছিলাম, এবং হঠাৎ করে আমি তাদের বেশ কয়েকটিকে ইনস্ট্যান্ট করেছিলাম, পাশাপাশি রেখেছিলাম, কয়েক মাস এবং বছরের মধ্যে ঝাঁপিয়ে পড়েছিলাম It ইত্যাদি এত সমৃদ্ধ যে আমাদের প্রকৃত বৈশিষ্ট্যগুলি বন্ধ করতে হয়েছিল। ইনস্ট্যান্টেশন আপনাকে সেই স্কেল দেয়।
রব

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

1
@ দোভাল আমি বুঝতে পারি না ও ও এর প্রতিটি আলোচনা অবশ্যই প্রয়োজনীয় ক্রিয়ামূলক প্রোগ্রামিংয়ের আলোচনায় রূপান্তরিত করতে পারে।
রব

6

তুমি জিজ্ঞেস করেছিলে:

কিন্তু স্থির শ্রেণীর চেয়ে বেশি কোনও কিছুর সুবিধা রয়েছে?

এই প্রশ্নের আগে আপনি পলিমারফিজম তালিকাভুক্ত করেছেন এবং অবজেক্টগুলি ব্যবহারের দুটি সুবিধা হিসাবে প্রায় পাস করেছেন। আমি বলতে চাই যে সেগুলি ওও দৃষ্টান্তের বৈশিষ্ট্য। এনক্যাপসুলেশন ওও দৃষ্টান্তের আরেকটি বৈশিষ্ট্য।

তবে, সেগুলি সুবিধা নয় not সুবিধাগুলি হ'ল:

  1. ভাল বিমূর্ততা
  2. ভাল রক্ষণাবেক্ষণ
  3. আরও ভাল পরীক্ষাযোগ্যতা

তুমি বলেছিলে:

তবে সম্প্রতি যখন আমি থেমেছি এবং এটি সম্পর্কে চিন্তাভাবনা করেছি, তখন বুঝতে পেরেছিলাম যে একটি স্থির শ্রেণি যেখানে আমি সাধারণত কোনও বস্তু ব্যবহার করি সেখানে প্রচুর স্থানে একটি অবজেক্টের মতোই একই কাজ করবে।

আমি মনে করি আপনার একটি বৈধ পয়েন্ট আছে। এর মূল অংশে, প্রোগ্রামিং ডেটা রুপান্তর এবং ডেটা ভিত্তিক পার্শ্ব প্রতিক্রিয়া তৈরি ছাড়া কিছুই নয়। কখনও কখনও ডেটা রূপান্তর করার জন্য সহায়ক ডেটা প্রয়োজন। অন্য সময়, এটি না।

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

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

তুমি জিজ্ঞেস করেছিলে:

কোনও অবজেক্টের সাথে কোডিং কলিং লাইনটি দেখতে পাবেন: Thing thing = fileLoader.load(file);

একটি স্ট্যাটিক বর্গ সহ, এটি দেখতে এটির মতো হবে: Thing thing = FileLoader.load(file);

পার্থক্য কি?

যদি FileLoaderনা, কি কখনো কোন ডেটা জমা করতে, আমি দ্বিতীয় পদ্ধতির সঙ্গে যেতে হবে প্রয়োজন। অপারেশন সম্পাদনের জন্য সহায়ক তথ্যের প্রয়োজন হওয়ার কোনও সুযোগের স্মিডজেন যদি থাকে তবে প্রথম পদ্ধতির একটি নিরাপদ বাজি।

তুমি জিজ্ঞেস করেছিলে:

আমি তালিকাভুক্ত দুটি থেকে অন্য বস্তুর আরও কি সুবিধা আছে? দয়া করে ব্যাখ্যা করুন.

আমি ওও দৃষ্টান্তটি ব্যবহারের সুবিধাগুলি (সুবিধাগুলি) তালিকাভুক্ত করেছি। আমি আশা করি তারা স্ব-বর্ণনামূলক। যদি তা না হয় তবে আমি বিস্তারিত জানাতে খুশি হব।

তুমি জিজ্ঞেস করেছিলে:

কিন্তু সিস্টেমের 'স্ট্যাটিক' অংশগুলির কী - যেগুলি প্রায় পাস হবে না? উদাহরণস্বরূপ - একটি 'সেভ ফাইল' প্রক্রিয়া। আমি কেন এটি কোনও স্থিতিক শ্রেণিতে নয়, কোনও বস্তুতে প্রয়োগ করব?

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

  1. এটি একটি সিএসভি ফাইলে সংরক্ষণ করুন।
  2. এটি একটি এক্সএমএল ফাইলে সংরক্ষণ করুন।
  3. এটি একটি জসন ফাইলে সংরক্ষণ করুন।
  4. ডেটার সরাসরি ডাম্প সহ এটি বাইনারি ফাইল হিসাবে সংরক্ষণ করুন।
  5. এটি একটি ডাটাবেসে কিছু টেবিলের মধ্যে সরাসরি সংরক্ষণ করুন।

এই জাতীয় অপশন সরবরাহ করার একমাত্র উপায় হ'ল একটি ইন্টারফেস তৈরি করা এবং ইন্টারফেস প্রয়োগকারী অবজেক্টগুলি তৈরি করা।

উপসংহারে

সমস্যাটির সঠিক হাতটি ব্যবহার করুন। এক পদ্ধতির তুলনায় অন্য পদ্ধতির বিষয়ে ধর্মীয় না হওয়া ভাল।


এছাড়াও, যদি বিভিন্ন বস্তুর প্রকার (ক্লাস) প্রয়োজন সংরক্ষিত করা (যেমন Melody, Chord, Improvisations, SoundSampleএবং অন্যদের), তারপর এটা বিমূর্ত মাধ্যমে বাস্তবায়ন প্রক্রিয়া সহজ করার জন্য লাভজনক হবে।
রওয়ং

5

এটি কখনও কখনও ভাষা এবং প্রসঙ্গে নির্ভর করে। উদাহরণস্বরূপ, PHPসার্ভিসিংয়ের অনুরোধগুলির জন্য ব্যবহৃত স্ক্রিপ্টগুলির সর্বদা পরিষেবাটির জন্য একটি অনুরোধ এবং স্ক্রিপ্টের পুরো জীবনকালে একটি প্রতিক্রিয়া উত্পন্ন হয়, সুতরাং অনুরোধটিতে কাজ করতে এবং প্রতিক্রিয়া উত্পন্ন করার স্থির পদ্ধতিগুলি উপযুক্ত হতে পারে। তবে লিখিত সার্ভারে Node.js, একই সাথে অনেকগুলি বিভিন্ন অনুরোধ এবং প্রতিক্রিয়া থাকতে পারে। সুতরাং প্রথম প্রশ্নটি হল - আপনি কি নিশ্চিত যে স্থির শ্রেণিটি সত্যই কোনও একক বস্তুর সাথে সামঞ্জস্য করে?

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

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


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

3

রব ওয়াইয়ের পোস্ট ছাড়াও


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

যাইহোক, এই দুটি ফাংশনটির একটি সাধারণ ব্যবহার শুরু হওয়ার সাথে সাথে আপনি এগুলি কোনওভাবে গ্রুপ করতে সক্ষম হতে চান। কল্পনা করুন যে আপনার কেবল একটি loadফাংশনই নয়, একটি hasValidSyntaxফাংশনও রয়েছে। তুমি কি করবে?

     if (FileLoader.hasValidSyntax(myfile))
          Thing thing = FileLoader.load(myfile);
     else
          println "oh noes!"

myfileএখানে দুটি উল্লেখ দেখুন ? আপনি নিজেকে পুনরাবৃত্তি করতে শুরু করেন কারণ আপনার বাহ্যিক অবস্থাটি প্রতিটি কলের জন্যই পাস করতে হয়। রব ওয়াই বর্ণনা করেছেন যে কীভাবে আপনি রাজ্যের অভ্যন্তরীণ হন (এখানে file) যাতে আপনি এটি এর মতো করতে পারেন:

     FileLoader myfileLoader = new FileLoader(myfile)
     if (myfileLoader.hasValidSyntax())
          Thing thing = myfileLoader.load();
     else
          println "oh noes!"

একই বস্তুতে দু'বার পাস করা একটি পৃষ্ঠের লক্ষণ; ফাইল, দুইবার খুলতে হবে তার পার্স দুইবার থাকতে পারে, এবং দুইবার বন্ধ, যদি - প্রকৃত সমস্যা এটা নির্দেশ করে যে কিছু কাজ redundantly সঞ্চালিত হয় hasValidSyntax()এবং load()পুনঃব্যবহারের রাষ্ট্র (ক আংশিকভাবে পার্স ফাইলের রিজাল্ট) অনুমতি দেওয়া হয় না।
রওয়ং

2

একটি প্রধান বিষয় ছিল যখন স্ট্যাটিক শ্রেণীর ব্যবহার যে তারা হল জোর আপনার নির্ভরতা লুকাতে আপনি, এবং জোর বাস্তবায়নের উপর নির্ভর করে আপনি। নিম্নলিখিত নির্মাণকারী স্বাক্ষরে আপনার নির্ভরতাগুলি কী:

public Person(String name)

ঠিক আছে, স্বাক্ষর থেকে বিচার করে একজন ব্যক্তির কেবল একটি নাম প্রয়োজন, তাই না? ঠিক আছে, বাস্তবায়ন হয় না তবে:

public Person(String name) {
    ResultSet rs = DBConnection.getPersonFilePathByName(name);
    File f = FileLoader.load(rs.getPath());
    PersonData.setDataFile(f);
    this.name = name;
    this.age = PersonData.getAge();
}

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

public void testPersonConstructor() {
    Person p = new Person("Milhouse van Houten");
    assertEqual(10, p.age);
}

এই যদিও পাস করা উচিত, তাই না? আমি বলতে চাইছি, আমরা অন্য সমস্ত জিনিসগুলি ঠিকঠাক করে রেখেছি? ঠিক আছে, আসলে এটি একটি ব্যতিক্রম সহ ফুঁ দিয়ে ওঠে। কেন? ওহ, হ্যাঁ, যে গোপনীয় নির্ভরতাগুলি আমরা জানতাম না তার বৈশ্বিক অবস্থা রয়েছে। DBConnectionচাহিদা সক্রিয়া এবং সংযুক্ত। FileLoaderচাহিদা একটি সঙ্গে সক্রিয়া FileFormatবস্তু (মত XMLFileFormatবা CSVFileFormat)। সেসবের কথা কখনও শুনিনি? ঠিক আছে, বিষয়টি। আপনার কোড (এবং আপনার সংকলক) আপনাকে বলতে পারে না যে আপনার এই জিনিসগুলির দরকার কারণ স্থির কলগুলি সেই নির্ভরতাগুলি আড়াল করে। আমি কি পরীক্ষা বলেছি? আমি বোঝাতে চাইছি যে নতুন জুনিয়র বিকাশকারী আপনার সাম্প্রতিক প্রকাশে এই জাতীয় কিছু পাঠিয়েছে। সব পরে, সংকলিত = কাজ, ঠিক আছে?

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

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

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


লুকানো নির্ভরতা অত্যন্ত ভাল পয়েন্ট। আমি আমার প্রবাদটি প্রায় ভুলে গেছি যে "কোডের মানের ব্যবহার করা হয় কীভাবে তা প্রয়োগ করা হয় তা নয়, বিচার করা উচিত" "
ইউফোরিক

তবে লুকানো নির্ভরতা কি অ-স্থিতিশীল শ্রেণিতে থাকতে পারে? সুতরাং আমি দেখতে পাচ্ছি না কেন এটি স্ট্যাটিক ক্লাসগুলির একটি অপূর্ণতা হবে তবে অ স্থির শ্রেণির নয়।
ভ্যালেন্ট্রি

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

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

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

1

শুধু আমার দুই সেন্ট।

আপনার প্রশ্নের জন্য:

কিন্তু সিস্টেমের 'স্ট্যাটিক' অংশগুলির কী - যেগুলি প্রায় পাস হবে না? উদাহরণস্বরূপ - একটি 'সেভ ফাইল' প্রক্রিয়া। আমি কেন এটি কোনও স্থিতিক শ্রেণিতে নয়, কোনও বস্তুতে প্রয়োগ করব?

আপনি নিজেকে জিজ্ঞাসা করতে পারেন সিস্টেমটি যে শব্দটি বাজায় সেই অংশটির প্রক্রিয়া, বা কোনও ফাইলের ডেটা সংরক্ষণ করে এমন সিস্টেমের অংশটি পরিবর্তন করতে পারে কিনা । যদি আপনার উত্তর হ্যাঁ হয় তবে এটি ইঙ্গিত করে যে আপনার abstract class/ ব্যবহার করে বিমূর্ত করা উচিত interface। আপনি জিজ্ঞাসা করতে পারেন, আমি কীভাবে ভবিষ্যতের জিনিসগুলি জানতে পারি? অবশ্যই, আমরা পারি না। সুতরাং, জিনিসটি রাষ্ট্রবিহীন থাকলে আপনি 'স্ট্যাটিক শ্রেণি' যেমন ব্যবহার করতে পারেন java.lang.Math, অন্যথায়, অবজেক্ট-ভিত্তিক পদ্ধতির ব্যবহার করতে পারেন।


একটি জিহ্ব-ইন-গাল পরামর্শ রয়েছে: তিনটি স্ট্রাইক এবং আপনি অশোধক , যা প্রস্তাব দেয় যে পরিবর্তনের আসলে প্রয়োজন না হওয়া পর্যন্ত কেউ আটকাতে পারে। "পরিবর্তন" বলতে আমি যা বোঝাতে চাইছি তা হল: একাধিক ধরণের অবজেক্টটি সংরক্ষণ করা দরকার; বা একাধিক ফাইল ফর্ম্যাট সংরক্ষণের প্রয়োজন (স্টোরেজ ধরণ); বা সংরক্ষিত ডেটার জটিলতায় এক মারাত্মক বৃদ্ধি। অবশ্যই যদি পরিবর্তনটি খুব শীঘ্রই ঘটবে এ ব্যাপারে মোটামুটি নিশ্চিত হয়ে থাকেন তবে কেউ আরও সামঞ্জস্যপূর্ণ ডিজাইন আপ-ফ্রন্টকে অন্তর্ভুক্ত করতে পারে।
রওয়ং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.