অবশেষে এবং একটি ডেস্ট্রাক্টরের মধ্যে ধারণাগত পার্থক্য কী?


12

প্রথমত, আমি ভালভাবেই অবগত যে কেন সি ++ এ 'অবশেষে' কোন নির্মাণ নেই? তবে অন্য একটি প্রশ্নে দীর্ঘ-বর্ধমান মন্তব্য আলোচনার ফলে একটি পৃথক প্রশ্নের নিশ্চয়তা পাওয়া যায়।

finallyসি # এবং জাভাতে মূলত স্কোপ প্রতি মাত্র একবার (== 1) থাকতে পারে এবং একক স্কোপের একাধিক (== n) সি ++ ডিস্ট্রাক্টর থাকতে পারে তা ছাড়াও আমি মনে করি যে তারা মূলত একই জিনিস। (কিছু প্রযুক্তিগত পার্থক্য সহ।)

তবে, অন্য একজন ব্যবহারকারী যুক্তি দেখিয়েছিলেন :

... আমি বলার চেষ্টা করছিলাম যে একটি ডর্টর অন্তর্নিহিতভাবে (প্রকাশিত শব্দার্থবিজ্ঞানের) জন্য একটি সরঞ্জাম এবং শেষ পর্যন্ত সহজাতভাবে (শব্দার্থক প্রতিশ্রুতিবদ্ধ) জন্য একটি সরঞ্জাম। আপনি যদি না দেখেন তবে: কেন অবশেষে ব্লকগুলিতে একে অপরের শীর্ষে ব্যতিক্রম ছড়িয়ে দেওয়া বৈধ, এবং কেন ধ্বংসকারীদের ক্ষেত্রে এটি একই নয় তা বিবেচনা করুন। (কিছুটা অর্থে, এটি একটি ডেটা বনাম নিয়ন্ত্রণের জিনিস Dest ডেস্ট্রাক্টররা ডেটা প্রকাশের জন্য, অবশেষে নিয়ন্ত্রণ মুক্ত করার জন্য They তারা আলাদা;

কেউ কি এটি পরিষ্কার করতে পারে?

উত্তর:


6
  • লেনদেন ( try)
  • ত্রুটি আউটপুট / প্রতিক্রিয়া ( catch)
  • বাহ্যিক ত্রুটি ( throw)
  • প্রোগ্রামার ত্রুটি ( assert)
  • রোলব্যাক (নিকটতম জিনিসগুলি ভাষাগুলিতে স্কোপ গার্ড হতে পারে যা তাদের স্থানীয়ভাবে সমর্থন করে)
  • রিসোর্স রিসোর্স (ধ্বংসকারী)
  • বিবিধ লেনদেন-স্বতন্ত্র নিয়ন্ত্রণ প্রবাহ ( finally)

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

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

যদিও এটি মনে হতে পারে যে এটি এতটা সাশ্রয় করবে না, পার্শ্ব প্রতিক্রিয়া বিপর্যয় ডান পাওয়া সবচেয়ে কঠিন জিনিসগুলির মধ্যে একটি (উদা: যেটি ব্যতিক্রম-নিরাপদ জেনেরিক ধারক লিখতে এত অসুবিধা সৃষ্টি করে)।


4

তারা একরকমভাবে - একইভাবে ফেরারি এবং ট্রানজিট উভয়ই বিভিন্ন ব্যবহারের জন্য ডিজাইন করা সত্ত্বেও দুধের পিন্টের জন্য দোকানগুলি নিপ করতে ব্যবহার করতে পারে।

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

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


4

আমার দৃষ্টিকোণ থেকে মূল পার্থক্যটি হ'ল সি ++ এর একজন ডেস্ট্রাক্টর হ'ল বরাদ্দ সম্পদগুলি প্রকাশের জন্য একটি অন্তর্নিহিত প্রক্রিয়া (স্বয়ংক্রিয়ভাবে আহ্বান করা) হয় ... চেষ্টা করার পরে ... অবশেষে এটি করার জন্য একটি সুস্পষ্ট প্রক্রিয়া হিসাবে ব্যবহার করা যেতে পারে ।

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

যখন সি ++ তে কোনও শ্রেণীর স্থানীয় ভেরিয়েবল তৈরি করা newহয় সেই দৃষ্টান্তের সংস্থানগুলি ব্যবহার না করেই যদি কোনও ব্যতিক্রম থাকে তখন ডেস্ট্রাক্টর দ্বারা জড়িত মুক্ত হয়।

// c++
void test() {
    MyClass myClass(someParameter);
    // if there is an exception the destructor of MyClass is called automatically
    // this does not work with
    // MyClass* pMyClass = new MyClass(someParameter);

} // on test() exit the destructor of myClass is implicitly called

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

// c#
void test() {
    MyClass myClass = new MyClass(someParameter);
    // if there is an exception myClass is NOT destroyed so there may be memory/resource leakes

    myClass.destroy(); // this is never called
}

এতে কোনও অন্তর্নিহিত প্রক্রিয়া নেই তাই আপনাকে শেষ পর্যন্ত চেষ্টা করে স্পষ্টভাবে এটি প্রোগ্রাম করতে হবে

// c#
void test() {
    MyClass myClass = null;

    try {
        myClass = new MyClass(someParameter);
        ...
    } finally {
        // explicit memory management
        // even if there is an exception myClass resources are freed
        myClass.destroy();
    }

    myClass.destroy(); // this is never called
}

সি ++ এ, বিনাশককে কেবল কোনও স্ট্যাক অবজেক্টের সাথে স্বয়ংক্রিয়ভাবে কেন বলা হয় এবং ব্যতিক্রমের ক্ষেত্রে হিপ অবজেক্টের সাথে কেন না?
জর্জিও 19

@ জর্জিও কারণ হিপ রিসোর্সগুলি মেমোরি স্পেসে বাস করে যা কল স্ট্যাকের সাথে সরাসরি আবদ্ধ নয়। উদাহরণস্বরূপ, 2 টি থ্রেড সহ একটি বহুবিবাহিত অ্যাপ্লিকেশনটি কল্পনা করুন Aএবং B। যদি A'sকোনও থ্রেড নিক্ষেপ করে, ফেরত লেনদেনের বরাদ্দকৃত সংস্থানগুলি ধ্বংস না করা উচিত B, উদাহরণস্বরূপ - থ্রেডের রাজ্যগুলি একে অপরের থেকে স্বতন্ত্র, এবং স্তূপে থাকা অবিরাম স্মৃতি উভয়েরই থেকে পৃথক। যাইহোক, সাধারণত সি ++ এ, হ্যাপ মেমরি এখনও স্ট্যাকের বস্তুর সাথে আবদ্ধ থাকে।

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

4

আপনি প্রশ্ন হিসাবে পোস্ট করেছেন খুশি। :)

আমি সেই ধ্বংসকারীদের বলার চেষ্টা করছিলাম এবং finallyধারণাগতভাবে পৃথক:

  • ডেস্ট্রাক্টরগুলি রিসোর্স রিলিজের জন্য ( ডেটা )
  • finallyকলারে ফিরে যাওয়ার জন্য ( নিয়ন্ত্রণ )

এই অনুমানমূলক সিউডো কোডটি বিবেচনা করুন, বলুন:

try {
    bar();
} finally {
    logfile.print("bar has exited...");
}

finallyএখানে সম্পদ পরিচালনার সমস্যা নয়, সম্পূর্ণ নিয়ন্ত্রণ সমস্যা সমাধান করা হচ্ছে।
এটি বিভিন্ন কারণেই কোনও ডেস্ট্রাক্টরেরে করা বুদ্ধিমান হবে না:

  • কোনও জিনিসই "অর্জিত" বা "তৈরি করা" হচ্ছে না
  • লগ ফাইলে মুদ্রণ করতে ব্যর্থতার ফলে রিসোর্স লিক, ডেটা দুর্নীতি ইত্যাদির ফলাফল আসবে না (ধরে নেওয়া যে এখানে লগফিল অন্য কোথাও প্রোগ্রামে খাওয়ানো হবে না)
  • এটি logfile.printব্যর্থ হওয়া বৈধ , যদিও ধ্বংস (ধারণাগত) ব্যর্থ হতে পারে না

জাভাস্ক্রিপ্টের মতো এবারও এখানে আরও একটি উদাহরণ রয়েছে:

var mo_document = document, mo;
function observe(mutations) {
    mo.disconnect();  // stop observing changes to prevent re-entrance
    try {
        /* modify stuff */
    } finally {
        mo.observe(mo_document);  // continue observing (conceptually, this can fail)
    }
}
mo = new MutationObserver(observe);
return observe();

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

অন্যদিকে, এই উদাহরণে:

b = get_data();
try {
    a.write(b);
} finally {
    free(b);
}

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

অন্য কথায়, আপনি যেহেতু উভয়ই এক সাথে একই সমস্যা বা এটি উভয়ই সমস্যার যথাযথ সমাধান solutions


ধন্যবাদ। আমি একমত নই, তবে ও :-) আমি মনে করি পরের দিনগুলিতে আমি একটি সম্পূর্ণ বিরোধী মতামত উত্তর যুক্ত করতে সক্ষম হব ...
মার্টিন বা

2
finallyএটিকে কীভাবে বেশিরভাগ ক্ষেত্রে (স্মৃতিবিহীন) রিসোর্স ফ্যাক্টর প্রকাশ করতে ব্যবহৃত হয়?
বার্ট ভ্যান ইনজেন শেহেনো

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

1
জাভাস্ক্রিপ্টে আমি যে ব্যবহারিক উদাহরণটি পেয়েছি সেগুলি হ'ল ফাংশন যা কিছু দীর্ঘ ক্রিয়াকলাপের সময় (যা একটি ব্যতিক্রম হতে পারে) অস্থায়ীভাবে একটি ঘড়ির কাঁচে পরিবর্তিত হয়, এবং তারপরে এটিকে ক্লজটিতে স্বাভাবিক অবস্থায় ফিরিয়ে দেয় finally। সি ++ ওয়ার্ল্ডভিউ এমন একটি ক্লাস চালু করবে যা একটি সিউডো-গ্লোবাল ভেরিয়েবলের একটি অ্যাসাইনমেন্টের এই "সংস্থান" পরিচালনা করে । এটি কোন ধারণামূলক জ্ঞান তৈরি করে? তবে ডেস্ট্রাক্টরগুলি হ'ল সি ++ এর হাতুড়ি যা ব্লক কোড কার্যকর করার জন্য প্রয়োজনীয় হয়।
dan04

1
@ ডান04: আপনাকে অনেক ধন্যবাদ, এটি এর জন্য নিখুঁত উদাহরণ। আমি শপথ করতে পারি যে আমি এমন অনেকগুলি পরিস্থিতি পেরিয়ে এসেছি যেখানে রাইআইয়ের কোনও ধারণা নেই তবে তাদের সম্পর্কে ভাবতে আমার এত কষ্ট হয়েছিল time
user541686

1

কে 3 বি এর উত্তর সত্যিই সুন্দরভাবে বাক্যাংশ দেয়:

সি ++ তে একটি ডেস্ট্রাক্টর হ'ল বরাদ্দ সম্পদ প্রকাশের জন্য অন্তর্নিহিত প্রক্রিয়া (স্বয়ংক্রিয়ভাবে আহ্বান করা হয়) চেষ্টা করার পরে ... অবশেষে এটি করার জন্য একটি সুস্পষ্ট প্রক্রিয়া হিসাবে ব্যবহার করা যেতে পারে ।

"সংস্থানগুলি" হিসাবে, আমি জোন কালবকে উল্লেখ করতে চাই : আরআইআই এর অর্থ দায়বদ্ধতা অর্জনের ইনিশিয়ালাইজেশন হওয়া উচিত

যাইহোক, অন্তর্নিহিত বনাম স্পষ্টত এটি সত্যিই এটি বলে মনে হয়:

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

আমি মনে করি এটি ধারণাগত অংশের জন্য, ...


... এখন আইএমএইচওর কিছু আকর্ষণীয় বিবরণ রয়েছে:

আমি এটাও ভাবি না যে ডিসট্রাক্টরের কিছু কোড চালনার দায়িত্ব ছাড়াও সিটিআর / ডিটোরকে ধারণামূলকভাবে "অর্জন" বা "তৈরি" করা দরকার। যা শেষ পর্যন্ত এটিও করে: কিছু কোড চালান।

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

(প্লাস, আমি শেষ পর্যন্ত যে "ভাল" কোডটি ছুঁড়ে ফেলা উচিত সে বিষয়ে মোটেই নিশ্চিত নই - সম্ভবত এটি নিজের কাছে আরও একটি সম্পূর্ণ প্রশ্ন।)


আমার জাভাস্ক্রিপ্ট উদাহরণে আপনার মতামত কি?
ব্যবহারকারী541686

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

আপনি কখনই এগুলিকে সম্বোধন করেননি ...
ব্যবহারকারীর 4168686

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

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