"কখন" বিবৃতি বলে কিছু আছে? [বন্ধ]


12

এমন কোনও ভাষা বা ভাষার বৈশিষ্ট্য রয়েছে যা "কখন" কেসগুলি পরিচালনা করতে পারে? অর্থাত্, যখনই কোনও শর্ত সত্য হয়ে যায়, কোনও সুযোগ বা প্রসঙ্গে, সেই অতিরিক্ত কোডটি কার্যকর করতে নির্দিষ্ট করা যেতে পারে?

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


1
SQL সার্ভার: select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from ...। এছাড়াও: এমএসডিএন.মাইক্রোসফট /en-us/library/dd233249.aspx মূলত আমি গুগল কোড অনুসন্ধান ব্যবহার করে "কখন" অনুসন্ধান করব।
কাজ

5
@ জোব: এটি একটি ধারা, বিবৃতি নয়।
বেন ভয়েগট

2
তুমি ভেরিলোগের মতো?
dan04

2
আরও বিবরণ প্রয়োজন ... খুব বিস্তৃত প্রশ্ন।
ওয়ার্নারসিডি

2
প্রশ্নটি এখানে মেটা নিয়ে আলোচনা হচ্ছে ।
অ্যাডাম শিখুন

উত্তর:


25

আপনার প্রশ্নটি পরিষ্কার নয় তবে পর্যবেক্ষক প্যাটার্নটি আপনি যে জিনিসটি খুঁজছেন তা মনে হচ্ছে http://en.wikedia.org/wiki/Observer_ Pattern


1
হ্যাঁ, আমি যা জিজ্ঞাসা করেছি সেগুলি এর জন্য একটি দেশীয় বাস্তবায়ন বলে মনে হচ্ছে। আমি প্রতিক্রিয়াশীল প্রোগ্রামিং পোস্ট করা বেলোতে "পর্যবেক্ষকের প্যাটার্নটি হ্রাস করা" (কোনও লিঙ্ক, সিটিআরএল + এফ এটি নেই) সম্পর্কিত একটি আকর্ষণীয় কাগজের দিকেও ইঙ্গিত করতে চাই। একটি যখন তাত্ত্বিকভাবে, বিবৃতিটি কোডের একটি ব্লক চালায় যখনই প্রোগ্রামটি কার্যকর করার সময়, কোনও শর্ত পূরণ করা হয় - এটি কীভাবে প্রয়োগ করা হয় নির্বিশেষে - এবং কমপক্ষে আমার কাজটি সহজতর করবে যাকে পরিবর্তে কার্যকর করতে হবে আমার দ্বারা পর্যবেক্ষক নিদর্শন।
উইন্ডসকার

15

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

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

কিছু ভাষার ভাষাগত নির্মাণের মাধ্যমে এ জাতীয় প্রক্রিয়া সরবরাহের জন্য বিস্তৃত সিনট্যাক্স বৈশিষ্ট্য রয়েছে; উদাহরণস্বরূপ তার প্রতিনিধি এবং ইভেন্টগুলির সাথে সি # হবে:

// 'when btnOK is clicked, run HandleOKClick'
btnOK.Clicked += this.HandleOKClick;

অন্যান্য ভাষা ওওপি কনস্ট্রাক্টস ব্যবহার করে (পর্যবেক্ষক প্যাটার্ন, ইভেন্ট শ্রোতা ইত্যাদি etc) জাভাতে একটি উদাহরণ (আমার জাভা কিছুটা মরিচা, তাই সম্পাদনা করতে নির্দ্বিধায়):

Foobar f = this;
btnOK.registerClickHandler(
    new ClickHandler {
        public void handleClick(Event e) {
            f.handleOKClick(e);
        }
    });

তবুও আরেকটি পদ্ধতি হল প্লেইন পুরাতন কলব্যাকগুলি। জাভাস্ক্রিপ্ট উদাহরণ:

var btnOK = $('btnOK');
btnOK.click(handleOKClick);

15

কেউ এখনো উল্লেখ করেছেন INTERCAL এর COMEFROM :

COMEFROM প্রথমে কৌতুক সমাবেশ ভাষার ভাষার নির্দেশাবলীর তালিকাতে দেখা গিয়েছিল ('সিএমএফআরএম' হিসাবে)। ১৯ Law৩ সালে আর। লরেন্স ক্লার্কের একটি ডেটাামেশন নিবন্ধে এটি বিশদভাবে প্রকাশিত হয়েছিল, এটি এডজার ডিজকস্ট্রার চিঠি টু বিবৃতিতে ক্ষতিকারক হিসাবে বিবেচিত চিঠির জবাবে লেখা হয়েছিল। COMEFROM অবশেষে আরও বেশি অস্পষ্ট 'গণিত COMEFROM' এর সাথে রীতিমতো প্রোগ্রামিং ল্যাঙ্গুয়েজ ইন্টারকলের সি-ইন্টার্কাল রূপে প্রয়োগ করা হয়েছিল। ফোরট্রান প্রস্তাবও ছিল 'বরাদ্দকৃত COME FROM' এবং একটি 'ডন্ট' কীওয়ার্ডের জন্য (বিদ্যমান 'ডিও' লুপের পরিপূরক)।

1 এপ্রিল 2004, রিচি হিনলে পাইথন প্রোগ্রামিং ভাষার জন্য GOTO এবং COMEFROM উভয়কেই একটি বাস্তবায়ন প্রকাশ করেছিলেন। এপ্রিল ফুল দিবসে মুক্তি পেয়ে এবং গুরুতর ব্যবহারের উদ্দেশ্যে না হওয়া সত্ত্বেও বাক্য গঠনটি বৈধ এবং বাস্তবায়ন পুরোপুরি কার্যকর হয়।


7
... এবং আপনাকে এটি লুণ্ঠন করতে হয়েছিল! :-)
স্টিফেন সি


2
@ বেনভয়েগ্ট: আপনার উত্তরটি পোস্ট করার সময় "ইন্টারকাল" বা "কমফ্রোম" ধারণ করে না।
ডেডএমজি

2
@DeadMG: আমার উত্তর "অন্তর্ভুক্ত en.wikipedia.org/wiki/COMEFROM প্রথম সংস্করণ থেকে"।
বেন ভয়েগট

2
@ বেনভয়েগ: এটি গণনা করা হয় না।
ডেডএমজি

6

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

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


একটি উদাহরণ (উপরের লিঙ্কযুক্ত ম্যানুয়াল পৃষ্ঠা থেকে কোডের উপর ভিত্তি করে) চিত্রিত করে।

set foo 1
set bar 2
proc doMult args {
    global foo bar foobar
    set foobar [expr {$foo * $bar}]
}
trace add variable foo write doMult
trace add variable bar write doMult
doMult

সেই বিন্দু থেকে, যে কোনও সময় হয় হয় $fooবা $barনতুন পূর্ণসংখ্যায় $foobarপরিণত হয়, দুটির পণ্য হয়ে ওঠে। স্বয়ংক্রিয়ভাবে.


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


4

ইভেন্ট হ্যান্ডলিংয়ের মতো কিছু?

এর পরিবর্তে ফানক () ইভেন্ট পরিচালনা করে

আপনি বলছেন যখন ইভেন্ট মজা করে

অথবা, একটি নির্দিষ্ট চলক উপর একটি কলব্যাক হতে পারে?


অবশ্যই একটি ইভেন্ট মত শোনাচ্ছে।
টন প্লম্প

4

হ্যাঁ, পার্লে একটি বিবৃতি সংশোধক হিসাবে এই জাতীয় কীওয়ার্ড রয়েছে:

say 'Well done!'        when 'A';

এটি স্যুইচ স্টেটমেন্টেরও একটি অংশ:

given ($foo) {
    when (/^abc/) { $abc = 1; }
    when (/^def/) { $def = 1; }
    when (/^xyz/) { $xyz = 1; }
    default { $nothing = 1; }
}

5
আমি পার্লকে চিনি না, তবে এটি 'কখন' আমার কাছে 'যদি' বেশি দেখায় ... আমার মনে হয় এই প্রশ্নের অর্থ 'কখন <<<<<<>' টাইপ 'কখন'।
ShdNx

1
switchআমার কাছে একটা বিবৃতি লেগেছে me (পিতল এটিতে নব, কিন্তু তারপর আবার সঙ্গে এটি হয় পার্ল ...)
Donal ফেলোগণ

আসলে, এটি caseএকটি switchবিবৃতিতে একটি । ঠিক আদার মতো।
mouviciel

4

না এই ( COMEFROMবিবৃতি উইকিপিডিয়া বর্ণিত) গণনা?

সারসংক্ষেপ:

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


6
আমি দেখছি আপনি কোথা থেকে এসেছেন।
পাব্বি

6
কোনও সংক্ষিপ্তসার ছাড়াই একটি লিঙ্কের জন্য -1; লিঙ্করোট হতে পারে।
হুগো

5
@ বেন - নির্বিশেষে, আপনি 3 টিরও বেশি শব্দ লেখার জন্য বিরক্ত করলে আপনার উত্তরটি আরও ভাল better
ব্ল্যাকজ্যাক

3
@ বেনভয়েগ্ট: সেক্ষেত্রে আপনি পুরো লিঙ্কটি "এটি" এর পিছনে লুকানোর পরিবর্তে স্রেফ পেস্ট করতে পারতেন।
মার্জন ভেনেমা

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

3

বিবৃতি দেওয়ার সময় আপনি কি কোনও সিনক্রোনাস বা অ্যাসিঙ্ক্রোনাসের সাথে কোনও ভাষা খুঁজছেন?

আমার কাছে ইভেন্টের (/ সাবস্ক্রিপশন / কলব্যাক) প্যাটার্নের মতো শোনাচ্ছে।

যেমন

conditionOwner.Condition += listener.WhenCondition

যখনই শর্তের মালিক শর্তটি হয়েছে তা অবহিত করে, শ্রোতারা কখন সংঘটন () করবে।

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

ভাষা হিসাবে,। নেট যেমন সিঙ্ক্রোনাস সাবস্ক্রিপশন (ইভেন্টস) তৈরি করেছে এবং এর প্রতিক্রিয়াশীল এক্সটেনশনগুলি (আরএক্স) অ্যাসিঙ্ক্রোনাস সাবস্ক্রিপশন যুক্ত করেছে।


3

ডেটাবেস ট্রিগারটির মতো বর্ণনার শব্দ যা কোনও নির্দিষ্ট দৃশ্যের জন্য অপেক্ষা করে এবং পরে সম্পাদন করার জন্য ডিজাইন করা হয়েছে।

উইকিপিডিয়া থেকে:

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

http://en.wikipedia.org/wiki/Database_trigger


3

আপনি যে বিষয়ে কথা বলছেন তা কাঠামোর চেয়ে কম বাক্য গঠন । আপনার কাছে কেবলমাত্র এমন একটি whenবক্তব্য থাকতে পারে যে কোনও সিস্টেমে একটি সীমাবদ্ধ পরিমাণে যুক্তি কার্যকর করে, তারপরে whenবিবৃতিগুলি কার্যকর করে, তারপরে লুপ করে আবার যুক্তিকে কার্যকর করে, অসীম লুপ অবিরত রেখে।

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

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

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

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

outputA = input1 && input2

কোডটি বোঝার জন্য সোজা (কারণ এটি ঘোষণামূলক)। যাইহোক, এটি কাজ করতে আপনাকে এটি একটি শক্ত লুপে চালিত করতে হবে। আপনি outputAলুপের মাধ্যমে প্রতিবার পুনরায় মূল্যায়ন করেন । অনেকগুলি ডেস্কটপ বা ওয়েব প্রোগ্রামার এটি পছন্দ করে না কারণ এটি অদক্ষ। তাদের কাছে, আপনার পুনঃমূল্যায়ন outputAকরা উচিত কেবল কখন input1বা input2পরিবর্তন হয়। তারা বরং আরও কিছু দেখতে পাবে যেমন আপনি বর্ণনা করছেন:

when input1 changes
    evaluateOutputA()

when input2 changes
    evaluateOutputA()

evaluateOutputA()
    outputA = input1 && input2

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

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

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

outputA = input1 && input2

(... বা যাই হোক না কেন উপযুক্ত VHDL সিনট্যাক্স হবে) তারপর FPGA আসলে যেমন যে আপ ওয়্যার্ড পরার input1এবং input2একটি এবং গেট ইনপুট ওয়্যার্ড হয়, এবং আউটপুট এবং গেট ওয়্যার্ড হয় outputA। সুতরাং, কোডটি কেবল বোঝা সহজ নয়, এটি অন্যান্য সমস্ত যুক্তির সাথে সমান্তরালে কার্যকর করাও কার্যকর এবং এটি কার্যকর।

আপনি যখন পাঁচটি আইসিসি -61131-3 টির মধ্যে একটিতে প্রোগ্রাম হওয়া পিএলসি বা পিএসি এর মতো শিল্প নিয়ন্ত্রকের কথা বলছেন, সাধারণ ক্ষেত্রে এই ধরণের ব্যবস্থা রয়েছে:

  1. ইনপুট পড়ুন এবং মেমরিতে সঞ্চয় করুন
  2. মূল প্রোগ্রাম কার্যকর করুন
  3. মেমরি থেকে আসল আউটপুটগুলিতে আউটপুট লিখুন
  4. পদক্ষেপ 1 এ যান

এটি সিস্টেমের আর্কিটেকচারে অন্তর্নির্মিত, সুতরাং আপনি কেবল লিখবেন এমনটি আশা করা যায়:

outputA = input1 && input2

... এবং এটি একটি অবিচ্ছিন্ন লুপে কার্যকর করা হবে।

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

সুতরাং, একটি traditionalতিহ্যবাহী ভাষায় (কোনও টাইট লুপ ছাড়া যে অসীমভাবে চলে) আপনাকে প্রশ্ন জিজ্ঞাসা করতে হবে, "মূল্যায়ন কোডটি কখন চালিত হয়"?

আপনি যদি লিখেন:

when A do
    launchNukes()

... এবং ধরে Aনেওয়া একটি নির্বিচারে বুলিয়ান অভিব্যক্তি, কখন আপনি এই অভিব্যক্তিটির পুনরায় মূল্যায়ন করবেন তা কীভাবে জানবেন? একটি নিষ্পাপ বাস্তবায়ন মানে প্রতিটি একক মেমরি লেখার পরে আপনাকে এটি পুনরায় মূল্যায়ন করতে হবে। আপনি মনে করতে পারেন যে আপনি এটিকে সঙ্কুচিত করতে পারেন তবে এটি বিবেচনা করুন:

when systemTime > actionTime do
    launchNukes()

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

উপসংহার

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


3

AspectJ ভাষা একটি যোগদান-পয়েন্ট মডেল, যা অবস্থা ঠিক এই ধরনের পরিচালনা করার জন্য এক সমাধান আছে।

AspectJ এ একটি জয়-পয়েন্ট জাভা প্রোগ্রামের একটি গতিশীল ইভেন্ট যা প্রোগ্রামটি সঞ্চালনের সময় ঘটে। জয়েন্ট-পয়েন্টগুলির উদাহরণগুলি: (1) একটি পদ্ধতি বলা হয়; (২) একটি পদ্ধতি কার্যকর করা হয়; (3) একজন কনস্ট্রাক্টর বলা হয়; (4) একজন কনস্ট্রাক্টর কার্যকর করা হয়; (5) একটি ক্ষেত্র সেট করা হয়; বা (6) একটি ক্ষেত্র অ্যাক্সেস করা হয়।

এরপরে আপনি এই যোগ-পয়েন্টগুলির সেট তৈরি করতে পারেন, পয়েন্টকটস বলে। পয়েন্টকুটগুলি তখন যোগ করা যায়, পরিপূরক হতে পারে এবং স্বাভাবিক সেট থিউরি উপায়ে ছেদ করা যায়। অন্যান্য পয়েন্ট কাটগুলি ভেরিয়েবলের মান / প্রকারের উপর শর্তযুক্ত করা যেতে পারে (উদাহরণস্বরূপ, "শুধুমাত্র x ধনাত্মক হলে", "কেবল তখন সেট করা মানটি এই ধরণের একটি সাবক্লাস হয়") এবং প্রোগ্রামের অবস্থার উপর ভিত্তি করে ("কখন এই পদ্ধতিটি বলা হয়, তবে কেবল তখনই যখন এই অন্যান্য পদ্ধতিটি এই থ্রেডের স্ট্যাকের উপরে থাকে [অর্থাত্ সেই পদ্ধতিটি পরোক্ষভাবে একে বলা হয়] ")।

একবার আপনি এই সমস্ত পয়েন্টকটগুলি প্রোগ্রামে ইভেন্টগুলি বর্ণনা করে ফেললে আপনি এই ইভেন্টগুলিতে পরামর্শ দেওয়ার জন্য AspectJ ব্যবহার করতে পারেন । আপনি ইভেন্টটি হওয়ার আগে ( beforeপরামর্শ), ইভেন্টটি হওয়ার পরে ( afterপরামর্শ), বা ইভেন্টটি হওয়ার পরিবর্তে ( পরামর্শ) কিছু করার জন্য বেছে নিতে পারেন around

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

দিক-ভিত্তিক প্রোগ্রামিংয়ের বাইরের অনেকেই বিশ্বাস করেন যে এওপি বেশিরভাগ ক্ষেত্রে "লগিং"। আপনি লগিং পরিচালনা করতে অ্যাসপেক্টজে ব্যবহার করতে পারেন এবং এটি বেশ ভালভাবে সম্পাদন করে ("এই প্যাকেজের সমস্ত পাবলিক পদ্ধতিগুলি কল করার সময় এই লগ ফাইলটিতে রেকর্ড করা হয় এবং তার ফলাফল / ত্রুটির ফলাফলগুলি কী ছিল")। তবে এ্যাসপেক্টজে-তে আরও অনেক কিছুই রয়েছে, কৃমি হোল প্যাটার্ন নামে ডায়নামিক স্কোপ অনুকরণ করার জন্য একটি চতুর কৌশল এবং [স্লাইড 23 এবং নিম্নলিখিত] দেখুন including

এওপি-র বাইরে, আপনি ইভেন্ট-ভিত্তিক প্রোগ্রামিংয়ের বিষয়েও কথা বলছেন, যার মধ্যে [যেমন অন্যরা উল্লেখ করেছেন] পর্যবেক্ষক প্যাটার্ন অন্তর্ভুক্ত রয়েছে। সমাধানগুলির মধ্যে পার্থক্যটি: (1) কীভাবে শর্তটি সনাক্ত করা হয়; (২) যেখানে শর্ত প্রকাশ করা হয়; এবং (3)-কোড-টু-এক্সিকিউটেট কীভাবে ইভেন্টের সাথে আবদ্ধ।


2

কীভাবে বিজ্ঞপ্তি / অপেক্ষা করতে হবে এটি এইটির কাছাকাছি মনে হবে:

আমরা উল্লেখ করেছি যে জাভা অপেক্ষার / বিজ্ঞপ্তি প্রক্রিয়াটি মূলত থ্রেডগুলির মধ্যে যোগাযোগের একটি উপায়। সংক্ষেপে, ধারণাটি নিম্নরূপ:

  • এক বা একাধিক থ্রেড সিগন্যালের জন্য অপেক্ষা করছে;
  • অন্য একটি থ্রেড বরাবর আসে এবং অপেক্ষমান থ্রেডগুলিকে অবহিত করে (যেমন "সংকেত সহ" এটি জাগ্রত করে তোলে))।

প্রসঙ্গের উপর নির্ভর করে কিছু কাঠামো রয়েছে যা এটির কাছাকাছি হতে পারে তবে আপনাকে অবশ্যই আপনার প্রশ্নটি পরিষ্কার করতে হবে।

এক্সএসএলটি-তে একটি "কখন" বিবৃতি রয়েছে :

উপাদানটি পরীক্ষার একটি সিরিজের উপর ভিত্তি করে ক্রিয়াকলাপের একটি কোর্স নির্ধারণ করতে ব্যবহৃত হয়। প্রতিটি পরীক্ষা একটি উপাদান ভিতরে করা হয়। যদি কোনও পরীক্ষা সফল হয়, তবে উপাদানটির বডি কার্যকর করা হয়। যদি কোনও পরীক্ষায় ব্যর্থ হয় তবে ডিফল্ট ক্রিয়া নির্দিষ্ট করতে কোনও উপাদান ব্যবহার করা যেতে পারে:


এক্সএসএলটি "যখন" একটি শর্তসাপেক্ষ স্টেটমেন্ট, যদি একটি আইএফ-এর চেয়ে বেশি পরিবর্তন হয় । তবে, প্রাথমিক প্রশ্নের "কখন" বলতে কী বোঝাতে চেয়েছিলেন তা প্রসঙ্গে আসলে খুব ভালভাবে পরিষ্কার করা হয়নি।

আমি সিতিকোর সিএমএসে বেশিরভাগ ক্ষেত্রে এক্সএসএলটি ব্যবহার করি যেখানে আমি সামগ্রী উপস্থাপনের জন্য কাজ করি যাতে এটি কোনও কোনও ক্ষেত্রে জিইউআই পরিবেশে ব্যবহার করা যায়।


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

2

আপনি যেটির জন্য জিজ্ঞাসা করছেন তাকে রিএ্যাকটিভ প্রোগ্রামিং বলা হয় ।

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

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

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

বেশিরভাগ ডেটা বাইন্ডিং ফ্রেমওয়ার্কগুলি প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের বাস্তবায়ন হিসাবে বিবেচনা করা যেতে পারে ।

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


আমার প্রশ্নের সেরা উত্তর। দুর্দান্ত কাগজ।
উইন্ডসকার

1
এটিকে "স্বীকৃত" হিসাবে নির্দ্বিধায় নির্দ্বিধায় (উইঙ্ক, উইঙ্ক, ডার, নোড)
রোল্যান্ড টেপ

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

1
@ রোল্যান্ডটাইপ লজ্জাহীন স্ব-প্রচার, তাই না? আমি আপনার সম্পর্কে যে প্রশংসা করি। +1
নীল

0

লিস্প (এবং স্কিম সহ এটির অনেকগুলি ডায়ালটিকস) এতে রয়েছে:

(when (> 2 1) 'do-something)

মূল্যায়ন do-somethingএবং:

(when nil 'other-thing)

nilবা তার সমতুল্য মূল্যায়ন করে ।


2
লিস্পস whenআরও একটি ইফের মতো, অপ্রত্যাশিতভাবে ওপি দ্বারা বর্ণিত পর্যবেক্ষক প্যাটার্ন নয়।
ocodo

0

আমি কেবল ত্রুটি পরিচালনার জন্য এই জাতীয় বিবৃতি জানি। উদাহরণস্বরূপ, বেসিক ON ERROR ...বা এসকিউএল * প্লাসWHENEVER SQLERROR ...

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


0

এটি ডেটাফ্লো ভাষার একটি বৈশিষ্ট্য যেমন হার্ডওয়্যার বর্ণনার ভাষা (ভেরিলোগ এবং ভিএইচডিএল)।

তা বাদে আমি অ্যাডা এবং এর ব্যতিক্রম হ্যান্ডলিং প্রক্রিয়াটি সম্পর্কে ভাবতে পারি: একটি ব্যতিক্রম হ্যান্ডলার ট্রিগার হয় whenকিছু ব্যতিক্রম উত্থাপিত হয়।


0

দেখে মনে হচ্ছে আপনি কন্ডিশন ভেরিয়েবল সন্ধান করছেন , এমন কিছু জিনিস যা থ্রেডগুলিকে কিছু প্রাকটিকেট সত্য না হওয়া পর্যন্ত ঘুমাতে দেয়।

বুস্ট সি জন্য কার্যকরী তাদের ++ এ্যাপাচি পোর্টেবল রানটাইম সি সাধারণ পাতার মর্মর জন্য কার্যকরী তাদের কাছে আপনার ব্যবহার করতে চাই bordeaux-thread'র make-condition-variable


আপনি এটি বাস্তবায়নের জন্য দায়বদ্ধ বইয়ের অংশটির নাম রাখতে পারেন?
উইন্ডসকার

0

আপনি যদি ড্রলসকে কোনও ভাষা হিসাবে বিবেচনা করেন তবে হ্যাঁ।

একটি উদাহরণ:

rule "Rule 08 - Debit"
when
    AccountingPeriod( $start : start, $end : end )
    $cashflow : AllocatedCashflow( $account : account, $date : date <= $end, $amount : amount, type==TypedCashflow.DEBIT )
    not AccountingPeriod( start < $start)
then 
    $account.setBalance($account.getBalance()-$amount);
    retract($cashflow);
end

0

পার্ল 6 এটি ব্যবহার করে সরাসরি ফ্যাশনে সংকেতগুলি পরিচালনা করতে পারে tap:

signal(SIGINT).tap: {
    note "Took { now - INIT now } seconds.";
    exit;
}

for 0, 1, *+* ... * {
    sleep 0.5;
    .say;
}

যদিও পাওয়ারশেল চেষ্টা / শেষ অবধি ব্লক দিয়ে একটি রান লুপ ব্যবহার করে এটি পরিচালনা করতে পারে:

$Start_Time = (Get-date).second
Write-Host "Type CTRL-C to Terminate..."
$n = 1
Try
{
    While($true)
    {
        Write-Host $n
        $n ++
        Start-Sleep -m 500
    }
}
Finally
{
    $End_Time = (Get-date).second
    $Time_Diff = $End_Time - $Start_Time
    Write-Host "Total time in seconds"$Time_Diff
}

যেমন ব্যবহার করে আশা করতে পারেন trap:

package require Expect

proc sigint_handler {} {
    puts "elapsed time: [expr {[clock seconds] - $::start_time}] seconds"
    set ::looping false
}

trap sigint_handler SIGINT

set start_time [clock seconds]
set n 0
set looping true
while {$looping} {
    puts [incr n]
    after 500
}

তথ্যসূত্র


0

আমি এগুলি দেখার পরে অনেক দীর্ঘ সময় হয়ে গেছে, তাই আমার ভুল হতে পারে।

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

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


0

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

একটি ওপিএস 5 প্রোগ্রাম একটি ঘোষণার অংশ নিয়ে গঠিত যেখানে বেসিক ডেটা কনস্ট্রাক্টসগুলি এমন একটি উত্পাদন বিভাগ দ্বারা সংজ্ঞায়িত করা হয় যেখানে ডেটা ম্যানিপুলেশনের নিয়ম রয়েছে।

ওপিএস 5 প্রোগ্রামগুলি কার্যকর মেমরির উপাদানগুলিকে উত্পাদন স্মৃতি এবং ফায়ারিংয়ের সাথে কার্যকর (কার্যকর করা) সর্বাধিক প্রভাবশালী নিয়মের সাথে মিলিয়ে কার্যকর করা হয় which ম্যাচ-সিলেক্ট-এক্সিকিউট চক্রটি প্রোগ্রামটি স্পষ্টভাবে থামানো না হওয়া বা কার্যকরী স্মৃতিতে কোনও নিয়ম মেলা না করা অবধি অব্যাহত থাকে।

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


-1

হাস্কেলের একটা আছে। তবে এটি কোনও বিশেষ নির্মাণ নয়, কেবলমাত্র অন্য একটি ফাংশন ha


-1

বেশিরভাগ ওওপি ভাষায় একটি অতিরিক্ত থ্রেড তৈরি করা সম্ভব হবে, এটি প্রসঙ্গ হিসাবে রাখুন:

    while (!value)
{
}

//Execute code

-1

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

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