জাভাতে, আমার যখন দরকার নেই তখনও প্যারামিটার এবং স্থানীয়দের জন্য "চূড়ান্ত" ব্যবহার করা উচিত?


105

জাভা এতে ভেরিয়েবল (ক্ষেত্র / স্থানীয় / পরামিতি) চিহ্নিত করার অনুমতি দেয় finalযাতে এগুলিতে পুনরায় বরাদ্দ আটকাতে পারে। আমি ক্ষেত্রগুলির সাথে এটি খুব দরকারী বলে মনে করি, কারণ এটি আমাকে দ্রুত দেখতে সহায়তা করে যে কয়েকটি বৈশিষ্ট্য - বা একটি সম্পূর্ণ শ্রেণি - অপরিবর্তনীয় বলে বোঝানো হয়েছে কিনা।

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

আমার প্রোগ্রামিং শৈলীর বিষয়ে আর আত্মবিশ্বাস নেই, আমি ভাবছি যে finalকোথাও প্রয়োগ করার অন্যান্য সুবিধা এবং অসুবিধাগুলি কী, সবচেয়ে সাধারণ শিল্প শৈলী কী এবং কেন।


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

1
@ ওক এটি বলছে: "নির্দিষ্ট প্রোগ্রামিং সমস্যা, সফ্টওয়্যার অ্যালগরিদম, কোডিং , স্ট্যাক ওভারফ্লো সম্পর্কে জিজ্ঞাসা করুন"
আমির রেজায়ে

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

3
@ আমির এটি পুরোপুরি এই সাইটের জন্য বিষয় হিসাবে এটি প্রোগ্রামিং সম্পর্কে বিষয়গত প্রশ্ন - দয়া করে / FAQ দেখুন
জেফ আতউড

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

উত্তর:


67

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

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

তদুপরি, যেমন আপনি অবশ্যই জানেন, finalআপনি গ্যারান্টি দেয় না যে আপনি কোনও (অলাভজনক) ভেরিয়েবলের মান / অবস্থা পরিবর্তন করতে পারবেন না। কেবলমাত্র একবার আপনি একবার শুরু হয়ে গেলে সেই বস্তুর রেফারেন্স পুনরায় নিয়োগ করতে পারবেন না । অন্য কথায়, এটি আদিম বা অপরিবর্তনীয় প্রকারের ভেরিয়েবলগুলির সাথে নির্বিঘ্নে কাজ করে। বিবেচনা

final String s = "forever";
final int i = 1;
final Map<String, Integer> m = new HashMap<String, Integer>();

s = "never"; // compilation error!
i++; // compilation error!
m.put(s, i); // fine

এর অর্থ হ'ল অনেক ক্ষেত্রে কোডের অভ্যন্তরে কী ঘটে তা বোঝা এখনও সহজ করে না এবং এটির ভুল বোঝাবুঝির ফলে সূক্ষ্ম বাগগুলি হতে পারে যা সনাক্ত করা শক্ত।


1
সম্পাদনা সম্পর্কে - আমি শব্দার্থ সম্পর্কে সচেতন final, আপনাকে ধন্যবাদ :) তবে সংক্ষিপ্ত এবং পরিষ্কার পদ্ধতি সম্পর্কে ভাল ধারণা - আমার ধারণা যে পদ্ধতিটি যদি যথেষ্ট সংক্ষিপ্ত হয় তবে এটি একটি পরিবর্তনশীলকে পুনরায় বরাদ্দ করা হচ্ছে না, আছে finalকীওয়ার্ড বিবেচনা করার জন্য এমনকি কম উদ্দেশ্য ।
ওক

চূড়ান্ত প্যারামিটার এবং স্থানীয় ভেরিয়েবলগুলি এবং এখনও একটি সংক্ষিপ্ত এবং পরিষ্কার সিনট্যাক্স থাকতে পারলে কী দুর্দান্ত হত না? প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জঞ্জ
প্রশ্নগুলি /

7
"চূড়ান্ত কোনও গ্যারান্টি দেয় না যে আপনি কোনও (অলাভজনক) ভেরিয়েবলের মান / অবস্থা পরিবর্তন করতে পারবেন না Only কেবলমাত্র আপনি একবার এটি আরম্ভ করার পরে object অবজেক্টের রেফারেন্সটি পুনরায় সাইন করতে পারবেন না" " ননপ্রিমিটিভ = রেফারেন্স (জাভাতে একমাত্র প্রকারগুলি আদিম ধরণের এবং রেফারেন্স ধরণের)। রেফারেন্স ধরনের ভেরিয়েবলের মান হয় একটি রেফারেন্স। অতএব, আপনি রেফারেন্সটিকে পুনরায় নিয়োগ করতে পারবেন না = আপনি মানটি পরিবর্তন করতে পারবেন না।
ব্যবহারকারী 102008

2
রেফারেন্স / রাষ্ট্রের বিপদের জন্য +1। নোট করুন যদিও জাভা 8 এর নতুন কার্যকরী দিকগুলিতে ক্লোজার তৈরি করার জন্য চূড়ান্ত চিহ্নিতকরণের প্রয়োজন হতে পারে
নিউটোপিয়ান

আপনার ব্যবহারকারী তুলনাটি @ ব্যবহারকারী 102008 নির্দেশিত হিসাবে পক্ষপাতদুষ্ট। পরিবর্তনশীল অ্যাসাইনমেন্টটি এর মান আপডেটের মতো নয়
এরিকন

64

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

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

এই কারণে আপনার finalকীওয়ার্ডটি ব্যবহার করা উচিত । আপনি বলেছেন যে আপনি জানেন যে এটি কখনও পুনর্নির্দিষ্ট করা হবে না, তবে অন্য কেউ তা জানেন না। finalতাত্ক্ষণিকভাবে ব্যবহার করা আপনার কোডটিকে আরও ক্ষুদ্র করে তুলবে।


8
যদি আপনার পদ্ধতিটি পরিষ্কার থাকে এবং কেবল একটি জিনিস করে তবে পাঠকও তা জানতে পারবেন। চূড়ান্ত শব্দটি কেবল কোডটিকে অপঠনযোগ্য করে তোলে। এবং যদি এটি
অপঠনযোগ্য এটি

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

4
ভেরিয়েবলটি কখনই পরিবর্তন হবে না এবং আপনার কোডটি সেই সত্যের উপর নির্ভর করে ? অথবা উদ্দেশ্যটি "এটি ঠিক তাই ঘটে যে এই পরিবর্তনশীলটি কখনই পরিবর্তন হয় না তাই আমি এটিকে চূড়ান্ত চিহ্নিত করছি"। পরবর্তীটি অকেজো এবং সম্ভবত ক্ষতিকারক শব্দ noise এবং যেহেতু আপনি সমস্ত স্থানীয়কে চিহ্নিত করার পক্ষে সমর্থন করছেন বলে মনে হয় , আপনি পরে করছেন। বড় -১।
user949300

2
finalউদ্দেশ্য অভিযুক্ত করে, যা সাধারণত কোডের এক টুকরোতে ভাল জিনিস, তবে এটি ভিজ্যুয়াল ক্লোটার যুক্ত করার মূল্যে আসে। প্রোগ্রামিংয়ের বেশিরভাগ জিনিসের মতো এখানেও একটি বাণিজ্য বন্ধ রয়েছে: আপনার চলকটি কেবল যুক্ত হওয়া ভার্বোসটির জন্য একবার ব্যবহারযোগ্য হবে তা প্রকাশ করছে?
christopheml

30

যেখানেই সম্ভব final/ ব্যবহার করার একটি সুবিধা constহ'ল এটি আপনার কোডের পাঠকের জন্য মানসিক বোঝা হ্রাস করে।

তাকে আশ্বস্ত করা যায়, যে মান / রেফারেন্স পরে আর পরিবর্তন হয় না। সুতরাং গননাটি বোঝার জন্য তাকে পরিবর্তনের দিকে মনোযোগ দেওয়ার প্রয়োজন নেই।

খাঁটি-কার্যকরী প্রোগ্রামিং ভাষা শেখার পরে আমি এই বিষয়ে আমার মন পরিবর্তন করেছি। ছেলে, কি স্বস্তি, যদি আপনি সর্বদা এর প্রাথমিক মান ধরে রাখতে কোনও "পরিবর্তনশীল" বিশ্বাস করতে পারেন।


16
ঠিক আছে, জাভাতে finalগ্যারান্টি দেয় না যে আপনি কোনও (অলাভজনক) ভেরিয়েবলের মান / অবস্থা পরিবর্তন করতে পারবেন না। কেবলমাত্র একবার আপনি একবার শুরু হয়ে গেলে সেই বস্তুর রেফারেন্স পুনরায় নিয়োগ করতে পারবেন না ।
পিটার টারিক

9
আমি জানি, এজন্যই আমি মান এবং রেফারেন্সের মধ্যে পার্থক্য করেছি। অপরিবর্তনীয় ডেটা স্ট্রাকচার এবং / অথবা খাঁটি-কার্যকারিতা প্রসঙ্গে ধারণাটি সবচেয়ে কার্যকর।
লেনি প্রোগ্রামার্স

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

18

আমি finalপদ্ধতি পরামিতি এবং স্থানীয় ভেরিয়েবলগুলিকে কোড শব্দ হিসাবে বিবেচনা করি। জাভা পদ্ধতির ঘোষণাগুলি বেশ দীর্ঘ হতে পারে (বিশেষত জেনারিক সহ) - এগুলি আর আর করার দরকার নেই।

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

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

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

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

ছাড়া final:

public void doSomething(String input) {
    input = input.toLowerCase();
    // do a few things with input
}

সহজ। পরিষ্কার করুন। সবাই জানেন যে কী চলছে।

এখন 'ফাইনাল' দিয়ে, বিকল্প 1:

public void doSomething(final String input) {
    final String lowercaseInput = input.toLowerCase();
    // do a few things with lowercaseInput
}

প্যারামিটারগুলি তৈরি করার finalসাথে কোডার যুক্ত কোডটি আরও নীচে থামিয়ে মনে করে যে সে মূল মানের সাথে কাজ করছে, এমন একটি ঝুঁকি রয়েছে যে কোডটি আরও নীচে ব্যবহার করতে পারে তার inputপরিবর্তে lowercaseInput, যা এটি করা উচিত নয় এবং যা সুরক্ষিত করতে পারে না, কারণ আপনি পারেন ' T এটা সুযোগ থেকে বের করে (অথবা এমনকি ধার্য nullকরতে inputযদি যে এমনকি যাহাই হউক না কেন সাহায্য করবে)।

'ফাইনাল' দিয়ে, বিকল্প 2:

public void doSomething(final String input) {
    // do a few things with input.toLowerCase()
}

এখন আমরা সবেমাত্র আরও কোড শব্দের তৈরি করেছি এবং toLowerCase()এন বার ডাকতে পারফরম্যান্স হিট চালু করেছি introduced

'ফাইনাল' সহ, বিকল্প 3:

public void doSomething(final String input) {
    doSomethingPrivate(input.toLowerCase());
}

/** @throws IllegalArgumentException if input not all lower case */
private void doSomethingPrivate(final String input) {
    if (!input.equals(input.toLowerCase())) {
        throw new IllegalArgumentException("input not lowercase");
    }
    // do a few things with input
}

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

এই সমস্যাটিও রয়েছে যে পদ্ধতিগুলি এত দীর্ঘ হওয়া উচিত নয় যে আপনি সহজেই এটিকে সহজেই দেখতে পাবেন না এবং এক নজরে জানতে পারবেন যে প্যারামিটারে একটি কার্য সম্পাদন হয়েছে।

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


এছাড়াও মনে রাখবেন যে finalএটি আপনাকে প্রথমে যেমন মনে হতে পারে তেমন সুরক্ষিত করে না:

public void foo(final Date date) {
    date.setTime(0); 
    // code that uses date
}

final প্যারামিটারের প্রকারটি আদিম বা অপরিবর্তনীয় না হলে সম্পূর্ণরূপে আপনাকে রক্ষা করে না।


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

ঝুঁকিটির দিকে ইঙ্গিত করার জন্য +1 "আরও নীচে কোডটি ইনপুট ব্যবহার করতে পারে"। তবুও, আমি আমার পরামিতিগুলিকে পছন্দ করবো final, উপরের মতো মামলায় তাদের চূড়ান্তভাবে চূড়ান্ত করার সম্ভাবনা রয়েছে। কোনও কীওয়ার্ড সহ স্বাক্ষরটি স্প্যাম করার পক্ষে এটি উপযুক্ত নয়।
মার্টিনাস

7

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


2
এছাড়াও, পরামিতিগুলির জন্য, কোনও পরামিতি বরাদ্দ করা থাকলে আপনি সংকলকটি একটি সতর্কতা বা ত্রুটি থাকতে পারে।
ওবরলিস

3
একেবারে বিপরীত, আমি কোডটি বিশৃঙ্খলা করায় এটি পড়তে আমার পক্ষে আরও কঠিন।
স্টিভ কুও

3
@ স্টিভ কুও: এটি আমাকে দ্রুত সমস্ত ভেরিয়েবলগুলি সন্ধান করার অনুমতি দেয়। কোনও বড় লাভ নয়, তবে একসাথে দুর্ঘটনাজনিত কার্যভার আটকাতে এটি 6 টি অক্ষরের মূল্য। varচূড়ান্তভাবে চূড়ান্ত অক্ষরগুলি চিহ্নিত করার মতো কিছু থাকলে আমি আরও বেশি খুশি হব । YMMV।
মার্টিনাস

1
@ মাআর্টিনাস সম্পর্কে সম্মত var! দুর্ভাগ্যক্রমে এটি জাভাতে ডিফল্ট নয় এবং এখন ভাষা পরিবর্তন করতে খুব দেরী। সুতরাং, আমি লেখার সামান্য অসুবিধা final
অ্যান্ড্রেস এফ

1
@ মাআর্টিনাস একমত আমি দেখতে পেয়েছি যে আমার (স্থানীয়) প্রায় 80-90% ভেরিয়েবলকে আরম্ভের পরে পরিবর্তন করার দরকার নেই। অতএব, তাদের মধ্যে ৮০-৯০% finalকীওয়ার্ডটি পুনরায় চাপিয়ে দেওয়া হয়েছে, যেখানে কেবল 10-20% এর প্রয়োজন হবে var...
জিমিবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.