পরামিতি ব্যতীত কোনও ফাংশনের কী সুবিধা যা কেবলমাত্র অন্য ফাংশনটিকে কল করে


21

একটি টিউটোরিয়াল (জাভাস্ক্রিপ্টের জন্য) আমি করছি যা পরামর্শ দেয় আমরা এর মতো একটি ফাংশন লিখি:

function sayHello() {
   //Some comments explaining the next line
   window.alert("Hello");
}

অস্পষ্টতা ব্যতীত বাস্তব জীবনে এই জাতীয় কিছু লেখার সুবিধা কি? যদি তা হয় তবে এর সুবিধা কী?


14
এটি সম্ভবত আপনার নিজের ক্রিয়াকলাপ কীভাবে সংজ্ঞায়িত করা যায় তা আপনাকে দেখানোর চেষ্টা করছে।
ডোভাল

4
আমি কখনই কোডটিকে এ জাতীয় অবলম্বন করার জন্য লিখতে পারি না - কোডারটি প্রোগ্রামারকে সহজেই পড়ার জন্য, অন্যভাবে নয় not অবসন্নতার জন্য একটি অবফসকেটার ব্যবহার করুন।
rhughes

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

9
@ পিটারবি আসলে "হোলা"
রেভ

29
@ পিটারবি - এবং যদি আপনি "হোলা" ভুল বানানটি আবিষ্কার করেন তবে আপনাকে কেবল এটি একটি জায়গায় ঠিক করতে হবে।
ড্যানিয়েল আর হিক্স

উত্তর:


60

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

কেন কোনও আরগ ফাংশনটি অন্য একটি ফাংশন কলটি মোড়কে রাখতে চায় তার বিভিন্ন কারণ রয়েছে। সাধারণ কলটি window.alert("Hello");এমন কিছু যা আপনি কল্পনা করার পরিবর্তে সরাসরি কল করার পরিবর্তে কল করতে পারেন sayHello()

তবে এর মধ্যে যদি আরও কিছু থাকে? আপনি কল করতে চান এমন এক ডজন জায়গা পেয়েছেন sayHello()এবং window.alert("Hello");পরিবর্তে লিখেছেন । এখন আপনি এটি করতে চান window.alert("Hello, it is now " + new Date())। আপনি যদি সেই সমস্ত কলগুলিকে sayHello()এক জায়গায় পরিবর্তন করে রাখেন তবে। যদি আপনি তা না করেন তবে আপনি এটি এক ডজন জায়গায় পরিবর্তন করুন। এটি নিজেকে পুনরাবৃত্তি করবেন না এ স্পর্শ করে । আপনি এটি করছেন কারণ ভবিষ্যতে আপনি আরও কয়েকবার এটি করতে চান না।

আমি অতীতে একটি i18n / l10n লাইব্রেরির সাথে কাজ করেছি যা পাঠ্যের ক্লায়েন্ট সাইড স্থানীয়করণ করতে ফাংশন ব্যবহার করে used sayHello()ফাংশন বিবেচনা করুন । holaব্যবহারকারী কোনও স্প্যানিশ ভাষায় স্থানীয়ীকৃত হলে আপনি এটি মুদ্রণ করতে পারেন । এটি এমন কিছু দেখতে পারে:

function sayHello() {
  var language = window.navigator.userLanguage || window.navigator.language;
  if(language === 'es') { window.alert('Hola'); }
   else { window.alert("Hello"); }
}

যদিও, লাইব্রেরিটি এভাবে কাজ করে না। পরিবর্তে, এর মতো দেখতে ফাইলগুলির একটি সেট ছিল:

# English file
greeting = hello
# Spanish file
greeting = hola

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

আমি জাভাস্ক্রিপ্ট কোডারের পক্ষে যথেষ্ট তা বলতে পারি না যে এটি ভাল বা খারাপ কিনা ... কেবল এটি ছিল এবং এটি একটি সম্ভাব্য পদ্ধতির হিসাবে দেখা যেতে পারে।

পয়েন্টটি হ'ল, কলটি তার নিজের কোনও ফাংশনে আবৃত করা প্রায়শই বেশ কার্যকর এবং অ্যাপ্লিকেশনটির মডুলারাইজেশনে সহায়তা করে এবং এর ফলে কোড পড়তে আরও সহজ হতে পারে।

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


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

34

আমি কখনও কখনও বাস্তবায়ন আড়াল জন্য এটি দরকারী মনে করি।

 function sayHello() {
  window.alert("Hello");
 }

এবং এটি আপনাকে এটি পরে পরিবর্তন করার নমনীয়তা দেয়

 function sayHello() {
  console.log("Hello");
 }

19

অস্পষ্টতা ব্যতীত বাস্তব জীবনে এই জাতীয় কিছু লেখার সুবিধা কি? যদি তা হয় তবে এর সুবিধা কী?

  • কেন্দ্রীকরণ: যদিও বাস্তবায়নটি একটি একক লাইন দীর্ঘ, যদিও এটি প্রায়শই পরিবর্তিত এমন একটি লাইন হয়, আপনি সম্ভবত যেখানেই বলবেন না সেখানে এটি সম্ভবত এক জায়গায় বদলাতে পছন্দ করবেন।

  • নির্ভরতা হ্রাস / আড়াল করা: আপনার ক্লায়েন্ট কোডটির আর জানার দরকার নেই যে উইন্ডো অবজেক্ট রয়েছে এবং আপনি এমনকি ক্লায়েন্ট কোডকে কোনও প্রভাব না দিয়ে পুরো বাস্তবায়নটি পরিবর্তন করতে পারেন

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

  • বিমূর্ত স্তর স্তরের দৃistence়তা: ক্লায়েন্ট কোড যদি উচ্চ স্তরের ক্রিয়াকলাপ ব্যবহার করে তবে উইন্ডো অবজেক্টের পরিবর্তে 'sayHello, SayBye' এবং কিছু অন্যান্য 'sayXXX' ফাংশন (গুলি) এর ক্ষেত্রে ক্লায়েন্ট কোড লিখতে আপনার আগ্রহী। প্রকৃতপক্ষে, ক্লায়েন্ট কোডে আপনি এমনকি জানতে চাইবেন না যে 'উইন্ডো' অবজেক্টের মতো জিনিস রয়েছে।


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

3
অন্যান্য কারণগুলি ভাল তবে বিমূর্ত স্তরগুলি উল্লেখ করার জন্য +1। স্পষ্ট বিমূর্তি এবং ভাল ফাংশন নাম ব্যবহার করা পুরানো কোডটি পড়া এবং বজায় রাখা আরও সহজ করে তুলতে পারে। যেখানে হেলো () বলা হয়, সেই স্থানে আপনি কীভাবে এটি কার্যকর করা হয় তা নিয়ে উদ্বিগ্ন নন, আপনি কেবল এই কোডের লাইনটির উদ্দেশ্য কী তা বুঝতে চান। এবং sayHello () মত একটি ফাংশন নাম যে সুস্পষ্ট করে তোলে।
kkrambo

এছাড়াও বিমূর্ততা স্তরের উল্লেখ করার জন্য +1: এটি ঘটতে পারে যে কোনও বিমূর্ত স্তর স্তরের কোনও ক্রিয়াকলাপের বাস্তবায়নটিতে একটি নিম্ন বিমূর্ত স্তর স্তরের অন্য ফাংশনে একটি কল থাকে। তাতে কি?
জর্জিও

7

আশ্চর্যজনক যে অন্য কোনও ব্যক্তি পরীক্ষার কথা উল্লেখ করেনি।

আপনি যে বিশেষ "মোড়ানো" লাইনটি বেছে নিয়েছেন window.alert('hello')তা আসলে এটির একটি নিখুঁত উদাহরণ। windowবস্তুর সাথে জড়িত যে কোনও কিছু সত্যই পরীক্ষা করার জন্য সত্যই বেদনাদায়ক। আপনার আবেদনে 1000 বার দ্বারা গুণিত করুন এবং আমি গ্যারান্টি দিচ্ছি যে বিকাশকারীরা শেষ পর্যন্ত পরীক্ষাটি ছেড়ে দেবে। অন্যদিকে, sayHelloগুপ্তচর এবং এটি যে কল হয়েছে এটি পরীক্ষা করে কেবল ফাংশনটি ক্লোবার করা খুব সহজ ।

আরও বাস্তব উদাহরণ - কারণ প্রকৃতপক্ষে, প্রকৃতপক্ষে কে window.alert(...)উত্পাদন কোডে ব্যবহার করে? - সিস্টেমের ঘড়িটি পরীক্ষা করছে। সুতরাং উদাহরণস্বরূপ, এটি। DateTime.Nowনেট, time(...)সি / সি ++, বা System.currentTimeMillis()জাভাতে মোড়ানো হবে । আপনি প্রকৃতপক্ষে এমন কোনও নির্ভরতার সাথে মোড়াতে চান যা আপনি ইনজেক্ট করতে পারেন, কারণ তারা কেবল (প্রায়) উপহাস / জাল করা অসম্ভব নয়, তারা কেবল পঠনযোগ্য এবং অ-সংজ্ঞাবিরোধী । সিস্টেম ক্লক ফাংশনটির সরাসরি ব্যবহার করে এমন কোনও ক্রিয়াকলাপ বা পদ্ধতি coveringেকে দেওয়া কোনও পরীক্ষা বিরতিহীন এবং / অথবা এলোমেলো ব্যর্থতায় ভুগতে পারে।

প্রকৃত মোড়ক একটি 1-লাইন ফাংশন - return DateTime.Now- তবে একটি খারাপ নকশাযুক্ত, অ-পরীক্ষাযোগ্য অবজেক্ট নিতে এবং এটি একটি পরিষ্কার এবং পরীক্ষামূলকভাবে তৈরি করার জন্য আপনার কেবল এটি প্রয়োজন। আপনি মোড়কের জন্য একটি জাল ঘড়িটি প্রতিস্থাপন করতে পারেন এবং আপনি যা চান তার সময় নির্ধারণ করতে পারেন। সমস্যা সমাধান.


2

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


2

আপনার প্রশ্নের পেছনের চিন্তাভাবনাটি মনে হচ্ছে: "কেন কেবল alert("Hello");সরাসরি লিখবেন না? এটি বেশ সহজ।"

উত্তরটি হ'ল আংশিক, কারণ আপনি সত্যিই কল করতে চান না alert("Hello")- আপনি কেবল হ্যালো বলতে চান।

বা: আপনি কেবল ফোন নম্বর ডায়াল করতে পারলে কেন আপনার ফোনে পরিচিতিগুলি সঞ্চয় করবেন? কারণ আপনি এই সমস্ত সংখ্যা মনে রাখতে চান না; কারণ ডায়ালিং নম্বরগুলি ক্লান্তিকর এবং ত্রুটি-প্রবণ; কারণ সংখ্যাটি পরিবর্তন হতে পারে তবে এটি অন্য প্রান্তে এখনও একই ব্যক্তি। কারণ আপনি লোককে কল করতে চান , সংখ্যা নয়।

এটি বিমূর্ততা, দিকনির্দেশনা, "বাস্তবায়ন বিবরণ গোপন করা", এবং এমনকি "এক্সপ্রেটিভ কোড" এর মতো পদ দ্বারা বোঝা যায়।

একই যুক্তি সর্বত্র কাঁচা মান লেখার পরিবর্তে ধ্রুবক ব্যবহারের ক্ষেত্রে প্রযোজ্য। আপনি যখনই প্রয়োজন প্রতিবার লিখতে পারেন3.141592... but তবে কৃতজ্ঞতার সাথে সেখানে Math.PI

আমরা নিজেও তাকিয়ে থাকতে পারি alert()। কে সতর্ক করে যে কীভাবে এটি তৈরি করে এবং সেই সতর্কতা সংলাপটি প্রদর্শন করে? আপনি কেবল ব্যবহারকারীকে সতর্ক করতে চান। আপনার লেখার সময় alert("Hello")এবং আপনার পর্দার পিক্সেলগুলির পরিবর্তনের মধ্যে, কোড এবং হার্ডওয়্যারগুলির একটি গভীর, গভীর স্তূপ রয়েছে, প্রতিটি স্তরটি যা চায় তার পরেরটি বলে দেয়, এবং পরবর্তী স্তরটি গভীরতার সম্ভাব্য স্তরটিতে কিছু বিট ফ্লিপ না করা পর্যন্ত বিশদ যত্ন নেবে ভিডিও স্মৃতি।

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

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

এটি বীজগণিত।


-1

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

একটি ফাংশন যা কেবলমাত্র প্রদত্ত আর্গুমেন্ট ব্যবহার করে একটি রিটার্ন মান গণনা করে, তাকে খাঁটি বলা হয় ।

একটি "ফাংশন" যা কোনও ক্রিয়া সম্পাদন করে তা আসলে একটি প্রক্রিয়া , যার একটি প্রভাব রয়েছে

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

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

একই কারণে আমাদের কোনও পদ্ধতির ফলাফলের প্রক্রিয়া এড়ানো উচিত। আমাদের ক্রিয়াকলাপটি (যদি থাকে তবে) ফিরিয়ে দেওয়া এবং খাঁটি ফাংশন দিয়ে পরবর্তী কোনও প্রক্রিয়াজাতকরণ করা ভাল।

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

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

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


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

@ অ্যারোনট এটি সত্য যে আমি ওওপির বিপক্ষে, তবে আমি অবশ্যই setFooকলগুলির পরামর্শ দেব না , যেহেতু এটি মিউটিয়েটেবল ডেটা বোঝায়। ভেরিয়েবল / বৈশিষ্ট্যের সামগ্রীতে পরিবর্তন করা একটি প্রভাব, যা সেই ডেটা ব্যবহার করে সমস্ত গণনা অশুচি হয়ে যায় causes আমি না করার পরামর্শ দিচ্ছি executeSE প্রতি কল, কিন্তু আমি চাই সুপারিশ runFooতাদের আর্গুমেন্ট উপর ভিত্তি করে কর্ম নির্বাহ জন্য পদ্ধতি।
ওয়ারবো 21

-2

আমি বলব এটি @ মিশেলটি এবং @ স্লেমান জেনিদি প্রদত্ত উত্তরের সংমিশ্রণ।

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

মুল বক্তব্যটি হ'ল বাস্তবায়ন এক জায়গায়। আপনার কেবল কোডটি এক জায়গায় বদলাতে হবে। (SayHello () সম্ভবত খুব সহজ উদাহরণ)


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