আমি জাভাতে কোঁকড়ানো ধনুর্বন্ধনী বাদ দিলে কি ঠিক আছে? [বন্ধ]


84

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

যাইহোক, আমার প্রশ্ন হল বন্ধনী থাকার গুরুত্ব কী? আমি এগুলি বাদ দিলে কি ঠিক আছে? উদাহরণ:

for (int i = 0; i < size; i++)  {
   a += b;
}

বনাম

for (int i = 0; i < size; i++)
   a += b;

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


আমি সবসময় পঠনযোগ্যতার জন্য একটি কোড ফর্ম্যাটর ব্যবহার করি কারণ এটি বিভ্রান্তির জন্য অনেকগুলি সম্ভাব্য কারণগুলি সমাধান করে। এটি কোঁকড়া বন্ধনীগুলিকে রিডানড্যান্ট ব্যবহার করে তৈরি করতে পারে
পিটার লরে

উত্তর:


149

এটি আপনার কোডের রক্ষণাবেক্ষণের বাইরে কিছুতেই পরিবর্তন করবে না । আমি এর মতো কোড দেখেছি:

for (int i = 0; i < size; i++)
   a += b;
   System.out.println("foo");

যার অর্থ এটি:

for (int i = 0; i < size; i++)
   a += b;
System.out.println("foo");

... তবে যা হওয়া উচিত ছিল :

for (int i = 0; i < size; i++) {
   a += b;
   System.out.println("foo");
}

ব্যক্তিগতভাবে আমি সর্বদাকোডটি পড়া বা সংশোধন করার সময় বন্ধনীগুলি বিভ্রান্তির সম্ভাবনা হ্রাস করতে অন্তর্ভুক্ত ।

আমি যে সকল সংস্থার জন্য কাজ করেছি সেগুলিতে কোডিং কনভেনশনের এটির প্রয়োজনীয়তা রয়েছে - যা অন্য কিছু সংস্থার পৃথক কনভেনশন না বলে ...

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


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

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

13
@ ওবেদনের চমৎকার রূপক, জন স্কিটি ব্যতিরেকে ছাড়া তিনি হলেন কমান্ডার ইন চিফ :-)
স্টিভ্লো

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

4
সর্বদা বন্ধনী ব্যবহার করার জন্য আরও যুক্তি: imperialviolet.org/2014/02/22/applebug.html
MrTJ

32

ধনুর্বন্ধনী ব্যবহার কোডটি আরও রক্ষণাবেক্ষণযোগ্য এবং বোধগম্য করে তোলে। সুতরাং আপনার সেগুলি ডিফল্ট হিসাবে বিবেচনা করা উচিত

কোডটি আরও কমপ্যাক্ট করার জন্য আমি মাঝে মাঝে গার্ড ক্লজগুলিতে ব্রেস ব্যবহার করে এড়িয়ে যাই । এর জন্য আমার প্রয়োজনীয়তা হ'ল তারা এমন ifবিবৃতি যা একটি লাফানো বিবৃতি অনুসরণ করে , যেমনreturn বা throw। এছাড়াও, আমি তাদের একই পংক্তিতে রাখি প্রতিযোগিতার প্রতি দৃষ্টি আকর্ষণ করার জন্য, যেমন:।

if (!isActive()) return;

এগুলি লুপের অভ্যন্তরে কোডেও প্রযোজ্য:

for (...) {
  if (shouldSkip()) continue;
  ...
}

এবং মেথড বডি এর শীর্ষে প্রয়োজনীয় নয় এমন পদ্ধতিগুলি থেকে অন্যান্য জাম্প-শর্তে।

কিছু ভাষায় (যেমন পার্ল বা রুবি) এক ধরণের শর্তাধীন বিবৃতি দেয় , যেখানে বন্ধনীগুলি প্রয়োগ হয় না:

return if (!isActive());
// or, more interestingly
return unless (isActive());

আমি এটিকে আমি যা বর্ণনা করেছি তার সমতুল্য বলে বিবেচনা করি তবে ভাষাটি স্পষ্টতই সমর্থন করে।


7
লুপগুলির ভিতরে +1 রক্ষাকারী ধারাগুলি কোঁকড়া ধনুর্বন্ধনীগুলি ছাড়াই সাধারণত আরও পরিষ্কার হয়।
ভিসারী

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

11

এখানে কোন পার্থক্য নেই. দ্বিতীয় সংস্করণটির প্রধান সমস্যা হ'ল আপনি এটি লিখে শেষ করতে পারেন:

for (...) 
  do_something();
  do_something_else();

আপনি যখন সেই পদ্ধতিটি আপডেট করেন, তা ভেবে do_something_else() লুপটির ভিতরে ডাকা হয়। (এবং এটি হেড-স্ক্র্যাচিং ডিবাগ সেশনগুলির দিকে নিয়ে যায়))

এখানে একটি দ্বিতীয় সমস্যা রয়েছে যা ব্রেস সংস্করণটিতে নেই এবং এটি সম্ভবত খুঁজে পাওয়া শক্ত:

for (int i=0; i<3; i++);
  System.out.println("Why on earth does this print just once?");

সুতরাং যদি আপনার কোনও ভাল কারণ না থাকে তবে ধনুর্বন্ধনীগুলি রাখুন, এটি কেবল কয়েকটি কীস্ট্রোক।


4
প্রথম পয়েন্টটি ভাল তবে দ্বিতীয় পয়েন্টটি ভুল। ব্রেস সংস্করণে এখনও এই সমস্যা থাকতে পারে। (int i = 0; i <3; i ++) এর জন্য; । System.out.println ("কেন এই মুদ্রণটি একবার মাত্র?"); । আমি জানি কারণ আমি সবসময় ধনুর্বন্ধনী ব্যবহার করি তবে মাঝে মাঝে ভুল করে অতিরিক্ত অর্ধিকোলন যুক্ত করি।
এমোরি

4
ব্রেস সংস্করণ এটি থাকতে পারে তবে ব্রেস একই লাইনে থাকলে এটি আরও দৃশ্যমান। পরের লাইনে বন্ধনী সহ, প্রকৃতপক্ষে, এটি বেশ খারাপ হিসাবে।
মাদুর

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

5

আমি মনে করি যে কোঁকড়ানো ধনুর্বন্ধনী বন্ধনগুলি ভাল, আপনি যদি স্বতঃ-বিন্যাসও ব্যবহার করেন তবে আপনার ইনডেন্টেশনটি সর্বদা সঠিক, সুতরাং কোনও ত্রুটি wayভাবে চিহ্নিত করা সহজ হবে।

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

তবে আমার বলতে হবে যে বিন্যাস ব্যবহার না করা বিপজ্জনক হতে পারে।


পাইথনে ইন্ডেন্টেশন সম্পর্কিত বিষয়। জাভা, সি, সি ++ বা অন্যান্য সি স্টাইলের ভাষায়, এটি হয় না।
ক্রিস্টোফার স্নাইডার

4
পুনঃটুইট করুন
মাটি মাগায়ার

5

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

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )

এখন বলুন যে কোনও অভ্যন্তরীণ সমস্যার কারণে আপনার এই কোডটি কাজ করছে না। আপনি ইনপুট চেক করতে চান। সুতরাং আপনি নিম্নলিখিত পরিবর্তন করুন:

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )
  Logger.log( creditCardInput )

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

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


আমি যুক্তি দিয়েছি যে এটি প্রথম স্থানে একটি দুর্দান্ত ভয়ঙ্কর নকশা, তবে বিন্দুটি বৈধ।
ক্রিস্টোফার স্নাইডার

4

আপনার যদি একটি বিবৃতি থাকে তবে আপনি বন্ধনীগুলি বাদ দিতে পারেন, আরও একটির জন্য কোডের ব্লক ঘোষণার জন্য একটি স্টেটমেন্ট বন্ধনী প্রয়োজনীয় kets

যখন আপনি বন্ধনী ব্যবহার করেন আপনি কোডের একটি ব্লক ঘোষণা করছেন:

{

//Block of code
}

আপনি যখন পাঠযোগ্যতার উন্নতির জন্য নেস্টেড স্টেটমেন্টের পরিস্থিতিতে আছেন তখন কেবল একটি বিবৃতি দিয়েও বন্ধনী ব্যবহার করা উচিত, উদাহরণস্বরূপ:

for( ; ; )
  if(a == b) 
    doSomething()

এটি বন্ধনীর সাহায্যে আরও পাঠযোগ্য, যদি প্রয়োজন হয় না:

for( ; ; ) {
  if(a == b) {
    doSomething()
   }
}

4

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


3

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


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

2

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

if (condition) doSomething();
for(int i = 0; i < arr.length; ++i) arr[i] += b;

এইভাবে শরীরের প্রসারিত হওয়ার পরে serোকানো বন্ধনীগুলি ভুলে যাওয়া আরও কঠিন। তবুও, যাই হোক না কেন curlies ব্যবহার করুন।


2

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


1

বুদ্ধিমান ফলাফল, এটি একই জিনিস।

দুটি বিষয় বিবেচনা করতে হবে।

- কোড রক্ষণাবেক্ষণ
- আলতোভাবে সংযুক্ত কোড। (অন্য কিছু কার্যকর করতে পারে because কারণ আপনি লুপের জন্য সুযোগটি নির্দিষ্ট করেন নি))

দ্রষ্টব্য: আমার পর্যবেক্ষণে, যদি এটি লুপের সাথে লুপ হয়। ধনুর্বন্ধনী ছাড়া অভ্যন্তরীণ লুপটিও নিরাপদ। ফলাফল পৃথক হবে না।


1

লুপের ভিতরে যদি আপনার কেবলমাত্র একটি বিবৃতি থাকে তবে এটি একই।

উদাহরণস্বরূপ নীচের কোডটি দেখুন:

for(int i=0;i<4;i++)
            System.out.println("shiva");

উপরের কোডে আমাদের কেবল একটি বক্তব্য রয়েছে। সুতরাং কোন সমস্যা

for(int i=0;i<4;i++)
            System.out.println("shiva");
            System.out.println("End");

এখানে আমাদের দুটি বক্তব্য রয়েছে তবে কেবলমাত্র প্রথম বিবৃতিটি লুপের ভিতরে আসে তবে দ্বিতীয় বিবৃতিটি নয়।

যদি আপনার একক লুপের অধীনে একাধিক বিবৃতি থাকে তবে আপনাকে অবশ্যই বন্ধনী ব্যবহার করতে হবে।


1

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


1

আজকাল, কোডগুলির মধ্যে কোন ব্লকটি ifবা for/ / রয়েছে তা খুঁজে বের করার জন্য কোডগুলি পুনরায় ইনডেন্ট করা খুব সহজ while। আপনি যদি জোর দিয়ে থাকেন যে পুনরায় ইনডেন্টিং করা কঠিন, তবে ভুল ইনডেন্টেশনে রাখা বন্ধনীগুলি আপনাকে সমানভাবে খারাপভাবে বিভ্রান্ত করতে পারে।

for(int i = 0; i < 100; i++) { if(i < 10) {
    doSomething();
} else { for(int j = 0; j < 5; j++) {
        doSomethingElse();
    }
}}

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

যদি ইনডেন্টেশন গুরুত্বপূর্ণ হয়, তবে আপনার ইতোমধ্যে আপনার কোডটি সঠিক ইনডেন্টেশনে লিখতে হবে, যাতে অন্যদের সঠিকভাবে পড়তে আপনার কোডগুলি পুনরায় প্রবেশ করতে হবে না।

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

for(int i = 0; i < 100; i++) {
    if(i < 10) {
    doSomething();
}
else {
    for(int j = 0; j < 5; j++) {
        doSomethingElse();
    }
}

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

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


0

কোডটি পুনরায় ফর্ম্যাট করার জন্য এটিও একটি প্রতিচ্ছবি হওয়া উচিত ... এটি পেশাদার দলগুলির পেশাদার প্রোগ্রামারদের পক্ষে অবশ্যই


0

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

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