পরিষ্কার কোড: কয়েকটি পরামিতি সহ সংক্ষিপ্ত পদ্ধতির পরিণতি


15

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

এটি আমার বোধগম্য যে শ্রেণি নির্মাতা একটি বৈধ অবজেক্ট তৈরির জন্য পুরোপুরি দায়বদ্ধ এবং এর মূল কাজটি কোনও অবজেক্টের (ব্যক্তিগত) বৈশিষ্ট্য নির্ধারণ করা। এটি অবশ্যই ঘটতে পারে যে শ্রেণি নির্মাতা ব্যতীত অন্য পদ্ধতিতে propertyচ্ছিক সম্পত্তির মানগুলি সেট করা যেতে পারে, তবে এই ধরনের পরিস্থিতি বরং বিরল (যদিও অগত্যা ভুল নয়, তবে শর্ত থাকে যে বাকী শ্রেণি এই জাতীয় সম্পত্তির optionচ্ছিকতা বিবেচনায় নেয়)। এটি গুরুত্বপূর্ণ, কারণ এটি নিশ্চিত করতে দেয় যে অবজেক্টটি সর্বদা বৈধ অবস্থায় রয়েছে।

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

আমি সন্দেহ করি যে বৃহত প্যারামিটারের তালিকা (<3 পরামিতি) এড়াতে পদ্ধতিগুলি সংক্ষিপ্ত রাখার (<= 5 টি কোডের লাইন) পরামর্শের দ্বারা এই কোডটি অনুপ্রেরণা পেয়েছে এবং নির্মাতারা অবশ্যই কাজ করবেন না (যেমন কোনও ধরণের গণনা সম্পাদন করা যা বস্তুর বৈধতার জন্য প্রয়োজনীয়।

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

আমি বরং কোডটি পুরোপুরি পরিবর্তন করার প্রস্তাব করব, যাতে ক্লাসটি একটি নির্দিষ্ট ক্রমে (পদ্ধতিগতভাবে) ডাকা উচিত এমন কয়েকটি পদ্ধতির পরিবর্তে একটি আসল অবজেক্টে নীল প্রিন্ট হয়ে যায়।

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


6
1. এক মুহুর্তের জন্য শয়তানের উকিল বাজানো ... কোডটি আসলে কাজ করে? কারণ ডেটা ট্রান্সফার অবজেক্টগুলি একটি পুরোপুরি বৈধ কৌশল, এবং যদি এই সব হয় তবে ...
রবার্ট হার্ভে

7
২. সমস্যাটি বর্ণনা করার মতো শব্দগুলির যদি আপনার অভাব হয় তবে আপনার সহকর্মীর অবস্থানকে খণ্ডন করার মতো পর্যাপ্ত অভিজ্ঞতা আপনার নেই।
রবার্ট হার্ভে

4
৩. যদি আপনার কিছু কার্যকরী কোড থাকে তবে আপনি পোস্ট পর্যালোচনাতে পোস্ট করতে পারেন এবং তাদের এটি দেখতে দিন। অন্যথায়, এটি কেবল একটি ঘোরাঘুরির সাধারণতা।
রবার্ট হার্ভে

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

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

উত্তর:


13

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

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

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

এস একক দায়িত্ব নীতি জন্য কঠিন স্ট্যান্ডে যা যে একটি বস্তু শুধুমাত্র এক জিনিস জন্য দায়ী হতে হবে। "জিনিস" খুব সুনির্দিষ্ট শব্দ নয়, সুতরাং এই নীতির বর্ণনগুলি বন্যভাবে পরিবর্তিত হয়। যাইহোক, ক্লিন কোডের লেখক আঙ্কেল ববও সেই ব্যক্তি যিনি এই নীতিটি রচনা করেছিলেন এবং এটিকে বর্ণনা করে বলেছেন: "একই কারণে পরিবর্তিত জিনিসগুলিকে একত্রিত করুন those বিভিন্ন কারণে পরিবর্তিত সেই জিনিসগুলি আলাদা করুন" " পরিবর্তনের কারণগুলির সাথে তিনি কী বোঝাতে চেয়েছেন তা চালিয়ে যান এখানে এবং এখানে(এখানে একটি দীর্ঘতর ব্যাখ্যা খুব বেশি হবে)। আপনি যে কারখানার সাথে व्यवहार করছেন সে ক্ষেত্রে যদি এই নীতিটি প্রয়োগ করা হয়, তবে খুব সম্ভবত সম্ভাবনা রয়েছে যে গণনাগুলির সাথে টুকরাগুলি হোল্ডিং স্টেটের সাথে লেনদেনকারীদের থেকে পৃথক হয়ে যাবে, কতগুলি কারণের উপর নির্ভর করে ক্লাসকে দুই বা ততোধিক ভাগে বিভক্ত করে by এই গণনা আছে পরিবর্তন করতে

এছাড়াও, ক্লিন ক্লাস হওয়া উচিত সংযোজক , যার মানে হল তার পদ্ধতির সবচেয়ে তার গুণাবলী অধিকাংশ ব্যবহার। যেমন, সর্বাধিক সম্মিলিত শ্রেণি এমন এক যেখানে সমস্ত পদ্ধতি তার সমস্ত বৈশিষ্ট্য ব্যবহার করে; উদাহরণস্বরূপ, একটি গ্রাফিকাল অ্যাপে আপনাকে Vectorগুণাবলীর সাথে একটি শ্রেণি থাকতে পারে Point aএবং Point bযেখানে কেবলমাত্র পদ্ধতি রয়েছে scaleBy(double factor)এবং printTo(Canvas canvas)উভয় বৈশিষ্ট্যের ক্ষেত্রেই অপারেটিং থাকে। বিপরীতে, একটি ন্যূনতম একযোগী শ্রেণি এমন এক যেখানে প্রতিটি বৈশিষ্ট্য কেবল একটি পদ্ধতিতে ব্যবহৃত হয় এবং প্রতিটি পদ্ধতির দ্বারা একাধিক অ্যাট্রিবিউট কখনও ব্যবহৃত হয় না। গড়ে একটি শ্রেণি সংযুক্ত অংশগুলির অ-সংযুক্ত "গোষ্ঠী" উপস্থাপন করে - অর্থাত কয়েকটি পদ্ধতিতে গুণাবলী ব্যবহার করা হয় a, bএবং cবাকী ব্যবহারের সময় cএবংd - এর অর্থ হ'ল আমরা যদি ক্লাসকে দুটি ভাগে ভাগ করি তবে আমরা দুটি সহকারী বস্তু দিয়ে শেষ করি।

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

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


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

1
এসআরপি সবচেয়ে গুরুত্বপূর্ণ গাইডলাইন; তাদের সমস্ত কিছুর উপরে নিয়ন্ত্রণ করার জন্য একটি রিং। ভাল সম্পন্ন এসআরপি স্বাভাবিকভাবেই খাটো পদ্ধতিতে ফলাফল দেয়। উদাহরণ: আমার কাছে ডাব্লু / কেবলমাত্র 2 জন সর্বজনীন এবং প্রায় 8 জন-সরকারী পদ্ধতি রয়েছে। কিছুই 3 লাইনের চেয়ে বেশি নয়; পুরো ক্লাসটি প্রায় 35 এলওসি। তবে আমি এই ক্লাসটি শেষ লিখেছি! সমস্ত অন্তর্নিহিত কোড লিখিত হওয়ার সাথে সাথে এই শ্রেণিটি মূলত নিজেই লিখেছিল এবং পদ্ধতিগুলি আরও বড় করতে আমার আসলে দরকার ছিল না। আমি কখনই বলিনি "আমি যদি এই পদ্ধতিগুলি আমাকে হত্যা করে তবে আমি 5 টি লাইনে লিখতে যাচ্ছি।" প্রতিবার আপনি এসআরপি প্রয়োগ করলেই তা ঘটে।
রাডারবব

11

এটি আমার বোধগম্য যে শ্রেণি নির্মাতা একটি বৈধ অবজেক্ট তৈরির জন্য পুরোপুরি দায়বদ্ধ এবং এর মূল কাজটি কোনও অবজেক্টের (ব্যক্তিগত) বৈশিষ্ট্য নির্ধারণ করা।

এটি সাধারণত অবৈধ অবস্থায় প্রাথমিক বৈধ অবস্থায় রাখার জন্য দায়ী, হ্যাঁ; অন্যান্য বৈশিষ্ট্য বা পদ্ধতিগুলি এরপরে রাষ্ট্রটিকে অন্য বৈধ অবস্থায় পরিবর্তন করতে পারে।

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

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

সন্দেহ করুন যে এই কোডটি পদ্ধতিগুলিকে সংক্ষিপ্ত রাখার পরামর্শ দ্বারা অনুপ্রাণিত হয়েছিল (<= 5 টি কোডের লাইন), বড় প্যারামিটারের তালিকা (<3 পরামিতি) এড়ানোর জন্য এবং নির্মাতারা অবশ্যই কাজ করবেন না (যেমন কোনও ধরণের গণনা সম্পাদন করা যা অবজেক্টের বৈধতার জন্য প্রয়োজনীয়।

অন্যদের উপেক্ষা করার সময় কিছু কোডিং গাইডলাইন অনুসরণ করা বোকামি কোডের দিকে যায়। যদি আমরা কোনও কনস্ট্রাক্টর কাজ করা এড়াতে চাই, উদাহরণস্বরূপ, বোধগম্য উপায় হ'ল সাধারণত নির্মাণের আগে কাজটি করা এবং সেই কাজের ফলাফলটি কনস্ট্রাক্টরের কাছে পৌঁছে দেওয়া। (এই পদ্ধতির জন্য একটি যুক্তি হতে পারে যে আপনি আপনার ক্লাসকে দুটি দায়িত্ব দেওয়া এড়িয়ে যাচ্ছেন: এর সূচনাকরণের কাজ এবং এটির 'প্রধান কাজ', যা কিছু হোক না কেন))

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

আমি বরং কোডটি পুরোপুরি পরিবর্তন করার প্রস্তাব করব, যাতে ক্লাসটি একটি নির্দিষ্ট ক্রমে (পদ্ধতিগতভাবে) ডাকা উচিত এমন কয়েকটি পদ্ধতির পরিবর্তে একটি আসল অবজেক্টে নীল প্রিন্ট হয়ে যায়।

আপনি সম্ভবত এটি সঠিক হবে। সোজা পদ্ধতিগত কোড লেখার ক্ষেত্রে কোনও ভুল নেই; অস্পষ্ট পদ্ধতিগত কোড লেখার জন্য ওও দৃষ্টান্তকে আপত্তিজনকভাবে সমস্যা আছে।

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

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


2
upvote কারণ: 1. এসআরপি জোর। "... ছোট পদ্ধতিগুলি ... প্রাকৃতিকভাবে অনুসরণ করুন" 2. নির্মাতার উদ্দেশ্য - বৈধ রাষ্ট্র। ৩. "অন্যদের উপেক্ষা করার সময় কিছু কোডিং নির্দেশিকা অনুসরণ করা হয়।" এটি কোডিংয়ের ওয়াকিং ডেড।
রাডারবাব

6

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

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.