পরিবর্তনীয় স্ট্রাক্টগুলি "দুষ্ট" কেন?


485

এখানে এসও নিয়ে আলোচনার পরে আমি ইতিমধ্যে বেশ কয়েকবার এই মন্তব্যটি পড়েছি যে পরিবর্তনীয় স্ট্রাক্টগুলি "দুষ্ট" (এই প্রশ্নের উত্তরের মতো )।

সি # তে রূপান্তর এবং স্ট্রাক্টগুলির সাথে আসল সমস্যাটি কী?


12
পরিবর্তনীয় স্ট্রাক্টকে দাবী করা খারাপ int, মিউটটেবল গুলি, boolএস দাবি করার মতো এবং অন্য সমস্ত মানের ধরণেরটি মন্দ। পরিবর্তন ও অপরিবর্তনীয়তার জন্য মামলা রয়েছে cases এই ক্ষেত্রে ডেটা যে ভূমিকা পালন করে তার উপর নির্ভর করে, মেমরি বরাদ্দ / ভাগ করে নেওয়ার ধরণের নয়।
স্লিপ ডি থম্পসন

41
@slipp intএবং boolহয় না চপল ..
Blorgbeard বাইরে

2
.-সিন্ট্যাক্স, পুনরায় টাইপ করা ডেটা এবং মান-টাইপ করা ডেটা দিয়ে অপারেশন করা একেবারে পৃথক হওয়া সত্ত্বেও একই দেখাচ্ছে। এটি সি # র বৈশিষ্ট্যের একটি ত্রুটি, স্ট্রাক্ট নয় — কিছু ভাষাগুলি a[V][X] = 3.14জায়গায় স্থান পরিবর্তন করার জন্য একটি বিকল্প সিনট্যাক্স সরবরাহ করে। সি # তে, আপনি 'মুত্তাটিভি (অ্যাকশন <রেফার ভেক্টর 2> মিউটর) এর মতো কাঠামো-সদস্য মিউটর পদ্ধতিগুলি উপস্থাপন করতে আরও ভাল করতে চান it এবং এটি ব্যবহার করুন a.MutateV((v) => { v.X = 3; }) (উদাহরণস্বরূপ সি # refকীওয়ার্ডের ক্ষেত্রে সীমাবদ্ধতার কারণে অতিরিক্ত সরলীকৃত তবে কিছুটির সাথে কর্মক্ষেত্রগুলি সম্ভব হওয়া উচিত)
স্লিপ ডি থম্পসন

2
@ স্লিপ ওয়েল, আমি এই জাতীয় স্ট্রাক্ট সম্পর্কে ঠিক বিপরীত মনে করি। আপনি কেন মনে করেন যে ডেটটাইম বা টাইমস্প্যানের মতো নেট নেট লাইব্রেরিতে ইতিমধ্যে প্রয়োগ করা স্ট্রাকগুলি অপরিবর্তনীয়? এই জাতীয় স্ট্রাক্টের কেবলমাত্র একজন সদস্যকেই পরিবর্তন করা কার্যকর হতে পারে তবে এটি কেবল খুব অসুবিধাজনক, অনেকগুলি সমস্যার দিকে পরিচালিত করে। প্রকৃতপক্ষে প্রসেসর কী গণনা করে সে সম্পর্কে আপনি ভুল, যেহেতু সি # এসেম্বলারের সংকলন করে না, এটি আইএলকে সংকলন করে। আইএল-তে (আমাদের ইতিমধ্যে ভেরিয়েবলের নাম প্রদান করে x) এই একক ক্রিয়াকলাপটি 4 টি নির্দেশনা: ldloc.0(0-সূচক ভেরিয়েবলটি এতে লোড করে ...
সুশি 271

1
... টাইপ। Tটাইপ হয়। রেফ কেবল একটি কীওয়ার্ড যা ভেরিয়েবলকে কোনও পদ্ধতিতেই পাস করা হয়, এর অনুলিপি নয়। রেফারেন্সের ধরণের জন্য এটিরও বুদ্ধি রয়েছে, যেহেতু আমরা ভেরিয়েবল পরিবর্তন করতে পারি , অর্থাত্ পদ্ধতির বাইরে রেফারেন্স পদ্ধতিতে পরিবর্তিত হওয়ার পরে অন্য বস্তুর দিকে নির্দেশ করবে। যেহেতু ref Tকোনও ধরণের নয়, তবে কোনও পদ্ধতি প্যারামিটারটি পাস করার ফ্যাশন, আপনি এটিতে রাখতে পারবেন না <>, কারণ কেবলমাত্র সেখানে টাইপ করা যেতে পারে। সুতরাং এটি ঠিক ভুল। সম্ভবত এটি করা সুবিধাজনক হবে, সম্ভবত সি # টিম এটি কিছু নতুন সংস্করণের জন্য তৈরি করতে পারে তবে এই মুহুর্তে তারা কিছু নিয়ে কাজ করছে ...
Sushi271

উত্তর:


290

স্ট্রাক্টগুলি মান ধরণের যা তার চারপাশে পাস করার পরে সেগুলি অনুলিপি করা হয়।

সুতরাং আপনি যদি একটি অনুলিপি পরিবর্তন করেন তবে আপনি কেবল সেই অনুলিপি পরিবর্তন করছেন, আসল নয় এবং আশেপাশের অন্যান্য কোনও অনুলিপিও নয়।

যদি আপনার স্ট্রাকটি পরিবর্তনযোগ্য হয় তবে মান দ্বারা পাস হওয়ার ফলে সমস্ত স্বয়ংক্রিয় অনুলিপি একই হবে the

আপনি যদি এটি পরিবর্তন করতে চান তবে আপনাকে পরিবর্তিত ডেটা সহ স্ট্রাক্টের একটি নতুন উদাহরণ তৈরি করে সচেতনভাবে এটি করতে হবে। (অনুলিপি নয়)


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

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

3
আপনার সম্পাদনা (16 মাস পরে) এটি আরও পরিষ্কার করে তোলে। আমি এখনও "(অপরিবর্তনীয় স্ট্রাক্ট) এর পাশে দাঁড়িয়েছি মানে আপনি আসলটি সংশোধন করছেন এমন ভেবে আপনি কোনও অনুলিপি সংশোধন করতে পারবেন না", যদিও।
লুকাস

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

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

167

কোথায় শুরু করতে হবে ;- পি

এরিক লিপার্টের ব্লগ একটি উদ্ধৃতির জন্য সর্বদা ভাল:

পরিবর্তনীয় মানের ধরণগুলি মন্দ হওয়ার এটি আরও একটি কারণ। সর্বদা মানের ধরণগুলি অপরিবর্তনীয় করার চেষ্টা করুন।

প্রথমত, আপনি পরিবর্তনগুলি খুব সহজেই হারাতে চান ... উদাহরণস্বরূপ, তালিকাগুলির বাইরে থাকা জিনিসগুলি:

Foo foo = list[0];
foo.Name = "abc";

কি পরিবর্তন হয়েছে? কিছুই দরকারী না ...

বৈশিষ্ট্যগুলির সাথে একই:

myObj.SomeProperty.Size = 22; // the compiler spots this one

আপনাকে করতে বাধ্য:

Bar bar = myObj.SomeProperty;
bar.Size = 22;
myObj.SomeProperty = bar;

কম সমালোচনামূলকভাবে, একটি আকার সমস্যা আছে; চপল বস্তু ঝোঁক একাধিক বৈশিষ্ট্য আছে বলে; তবুও যদি আপনার দুটি intগুলি, ক string, ক DateTimeএবং ক দিয়ে স্ট্রাক্ট থাকে তবে আপনি boolখুব স্মৃতিতে খুব দ্রুত জ্বলতে পারেন। কোনও শ্রেণীর সাথে একাধিক কলকারী একই ঘটনার একটি রেফারেন্স ভাগ করতে পারেন (উল্লেখগুলি ছোট)।


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

12
@ কনরাড: মাইওবিজে.সোমপ্রোপার্টি.সাইজ = ২২ মাইওবিজে.সোমপ্রোপার্টিটির একটি কপি সংশোধন করবে। সংকলক আপনাকে সুস্পষ্ট বাগ থেকে বাঁচাচ্ছে is এবং এটি ++ এর জন্য অনুমোদিত নয়।
লুকাস

@ লুকাস: আচ্ছা, মনো সি সি সংকলক অবশ্যই এটির অনুমতি দেয় - যেহেতু আমার উইন্ডোজ নেই আমি মাইক্রোসফ্টের সংকলকটি পরীক্ষা করতে পারি না।
কনরাড রুডল্ফ

6
@ কনরাড - একটি কম নির্দেশের সাথে এটি কাজ করা উচিত; এটি হ'ল "এমন কোনও মানের মূল্য পরিবর্তন করা যা কেবল স্ট্যাকের একটি ক্ষণস্থায়ী মান হিসাবে উপস্থিত থাকে এবং যা কিছুতেই উদ্বিগ্ন হতে চলে না" যা কেসটি অবরুদ্ধ।
মার্ক Gravell

2
@ মার্ক গ্র্যাভেল: আগের কোডের টুকরোয় আপনি একটি "ফু" দিয়ে শেষ করেছেন যার নাম "এবিসি" এবং যার অন্যান্য বৈশিষ্ট্যগুলি তালিকা [0] এর মধ্যে বিরক্তিকর তালিকা ছাড়াই [0]। যদি ফু একটি শ্রেণি হত তবে এটির ক্লোন করা এবং তারপরে অনুলিপিটি পরিবর্তন করা প্রয়োজন। মনে মনে, মান-প্রকারের বনাম শ্রেণীর পার্থক্য নিয়ে বড় সমস্যাটি "এর ব্যবহার of" অপারেটর দুটি উদ্দেশ্যে। যদি আমার ড্রথার থাকত তবে ক্লাসগুলি উভয়কেই সমর্থন করতে পারে "। এবং "->" পদ্ধতি এবং বৈশিষ্ট্যগুলির জন্য, তবে "" এর জন্য সাধারণ শব্দার্থবিদ্যা। " বৈশিষ্ট্যগুলি উপযুক্ত ক্ষেত্রটি পরিবর্তিত করে একটি নতুন উদাহরণ তৈরি করবে।
সুপারক্যাট

71

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

এর একটি উদাহরণ পড়ুন / লিখুন এবং লিখুন লিখুন / বর্ণের অবস্থার বিরোধগুলি লিখুন। এগুলি কেবল অপরিবর্তনীয় কাঠামোর মধ্যে ঘটতে পারে না, যেহেতু কোনও লিখন বৈধ অপারেশন নয়।

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


1
এরিক লিপার্ট বলেছেন যে তারা ... আমার উত্তর দেখুন।
মার্ক Gravell

42
আমি যেমন এরিক লিপার্টকে শ্রদ্ধা করি তিনি Godশ্বর নন (বা কমপক্ষে এখনও হননি)। আপনি যে ব্লগ পোস্টে লিঙ্ক করেছেন এবং উপরে আপনার পোস্টটি স্ট্রাকসকে অবশ্যই পরিবর্তনহীন করার পক্ষে যুক্তিযুক্ত যুক্তিযুক্ত তবে তারা কখনও পরিবর্তনযোগ্য স্ট্রাক্ট ব্যবহার না করার যুক্তি হিসাবে খুব দুর্বল । এই পোস্টটি অবশ্য একটি +1।
স্টিফেন মার্টিন

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

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

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

48

পরিবর্তনীয় স্ট্রাইকগুলি মন্দ নয়।

উচ্চ কার্যকারিতা পরিস্থিতিতে এগুলি একেবারে প্রয়োজনীয়। উদাহরণস্বরূপ যখন ক্যাশে লাইন এবং বা আবর্জনা সংগ্রহ একটি বাধা হয়ে দাঁড়ায়।

আমি এই নিখুঁতভাবে বৈধ ব্যবহারের ক্ষেত্রে "অশুভ" কোনও অপরিবর্তনীয় কাঠামোর ব্যবহারকে কল করব না।

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

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

উদাহরণস্বরূপ: "স্ট্রাক্টগুলি মান ধরণের, যা ডিফল্টরূপে অনুলিপি করা হয় you আপনি যদি তাদের অনুলিপি করতে না চান তবে আপনার একটি রেফারেন্সের প্রয়োজন" বা "কেবলমাত্র পঠনযোগ্য স্ট্রাক্টের সাথে কাজ করার চেষ্টা করুন"


8
আমি এটিও পোস্ট করব যে যদি কেউ নালী টেপের সাথে স্থির করে একটি নির্দিষ্ট সেট বেঁধে রাখতে চায় যাতে তাদের মানগুলি পৃথকভাবে বা ইউনিট হিসাবে প্রক্রিয়া করা যায় বা সংরক্ষণ করা যায়, তবে এটি সংকলককে একটি নির্দিষ্ট সেট বেঁধে রাখতে আরও বেশি অর্থবোধ করে makes ভেরিয়েবল একসাথে (অর্থাত্ structপ্রকাশ্য ক্ষেত্রগুলির সাথে একটি ঘোষনা করা ) একটি ক্লাস সংজ্ঞায়িত করার পরিবর্তে একই রকম অর্জনের জন্য, ছদ্মবেশী, বা এমন একটি শ্রেণীর অনুকরণ করার জন্য কোনও কাঠামোতে একগুচ্ছ জাঙ্ক যোগ করার (এটি পরিবর্তে এটির পরিবর্তে) নালী টেপের সাথে একসাথে আটকে থাকা ভেরিয়েবলের সেটটির মতো আচরণ করুন, যা সত্যই প্রথম স্থানটিতে চায়)
সুপারক্যাট

41

জনসাধারণের পরিবর্তনযোগ্য ক্ষেত্র বা বৈশিষ্ট্যগুলি সহ স্ট্রাক্টগুলি মন্দ নয়।

কাঠামোগত পদ্ধতি (সম্পত্তি সেটারের থেকে পৃথক) যা "এটি" কিছুটা খারাপ তা কেবল পরিবর্তিত করে। স্ট্রাক পদ্ধতিগুলি যে "এই" কে রূপান্তরিত করে না, এমনকি প্রতিরক্ষামূলক অনুলিপি ছাড়াই কেবল পঠনযোগ্য স্ট্রাক্টগুলিতে চালিত হওয়া উচিত। "এটি" রূপান্তরকারী পদ্ধতিগুলি কেবল পঠনযোগ্য স্ট্রাক্টগুলিতে মোটেও চালানো উচিত নয়। যেহেতু .NET এমন কাঠামো পদ্ধতিগুলি নিষিদ্ধ করতে চায় না যা "কেবল" কেবলমাত্র পঠনযোগ্য স্ট্রাক্টগুলিতে চালিত হওয়া থেকে পরিবর্তিত হয় না, তবে কেবলমাত্র পঠনযোগ্য স্ট্রাক্টগুলিকে পরিবর্তিত হতে দেয় না, তাই এটি প্রতিরক্ষামূলকভাবে কেবল স্ট্রাক্টগুলিতে অনুলিপিগুলি অনুলিপি করে ies উভয় পৃথিবীর মধ্যে সবচেয়ে খারাপ দিকটি কেবল প্রসঙ্গেই রয়েছে।

কেবল পঠনযোগ্য প্রেক্ষাপটে স্ব-পরিবর্তনের পদ্ধতিগুলি পরিচালনা করার ক্ষেত্রে সমস্যা থাকা সত্ত্বেও, পরিবর্তনযোগ্য স্ট্রাক্টগুলি প্রায়শই শব্দার্থকে পারস্পরিক পরিবর্তনযোগ্য শ্রেণির চেয়ে অনেক উচ্চতর প্রস্তাব দেয়। নিম্নলিখিত তিনটি পদ্ধতি স্বাক্ষর বিবেচনা করুন:

Point পয়েন্টিস্ট্রাক্ট {পাবলিক ইনট এক্স, ওয়াই, জেড;};
শ্রেণি পয়েন্টি ক্লাস {পাবলিক ইন্ট x, y, z;;;

অকার্যকর পদ্ধতি 1 (পয়েন্টিস্ট্রাক্ট ফু);
অকার্যকর মেথড 2 (রেফার্ট পয়েন্টিস্ট্রাক্ট ফু);
অকার্যকর পদ্ধতি 3 (পয়েন্টি ক্লাস ফু);

প্রতিটি পদ্ধতির জন্য, নিম্নলিখিত প্রশ্নের উত্তর দিন:

  1. অনুমান করে যে পদ্ধতিটি কোনও "অনিরাপদ" কোড ব্যবহার করে না, এটি ফুকে সংশোধন করতে পারে?
  2. পদ্ধতিটি বলার আগে যদি 'foo' এর বাইরের কোনও রেফারেন্স উপস্থিত না থাকে, তবে কোনও বাহ্যিক রেফারেন্স পরে থাকতে পারে?

উত্তর:

প্রশ্ন 1::
Method1()না (স্পষ্ট উদ্দেশ্য)
Method2() : হ্যাঁ (পরিষ্কার উদ্দেশ্য)
Method3() হ্যাঁ (অনিশ্চিত উদ্দেশ্য)
প্রশ্ন 2
Method1():: না
Method2(): না (অনিরাপদ ব্যতীত)
Method3() : হ্যাঁ

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

স্ট্রাকচারের অ্যারেগুলি দুর্দান্ত শব্দার্থবিদ্যা সরবরাহ করে। রেক্টআরএল [৫০০] ধরণের আয়তক্ষেত্র দেওয়া, এটি কীভাবে উদাহরণ 123 উপাদানটিকে 456 এ নকল করতে হবে তা স্পষ্ট এবং সুস্পষ্ট এবং পরে কিছুক্ষণ পরে বিরক্তিকর উপাদান 456 ছাড়াই 123 থেকে 555 এলিমেন্টের প্রস্থ নির্ধারণ করতে পারেন। "রেক্টআরে [432] = রেক্টআরে [321 ]; ...; রেক্টআরারি [123]। প্রস্থ = 555; "। আয়তক্ষেত্রটি প্রস্থ নামক একটি পূর্ণসংখ্যার ক্ষেত্র সহ একটি কাঠামো তা জেনে উপরের বিবৃতিগুলি সম্পর্কে সকলকে জানা দরকার।

এখন ধরা যাক রেক্টক্লাসটি একটি ক্ষেত্র ছিল যা আয়তক্ষেত্রের মতো একই ক্ষেত্রযুক্ত এবং RectClassArray [500] টাইপ রেক্টক্লাসে একই ক্রিয়াকলাপ করতে চেয়েছিল। সম্ভবত অ্যারের পরিবর্তনীয় রেক্টক্লাস বস্তুর 500 প্রারম্ভিক প্রাথমিক পরিবর্তনযোগ্য রেফারেন্স রাখার কথা। সেক্ষেত্রে সঠিক কোডটি "রেক্টক্লাসআরাই [321]। সেটবাউন্ডস (রেক্টক্লাসআরাই [456]); ...; রেক্টক্লাসআরে [321]। এক্স = 555;" এর মতো কিছু হবে। সম্ভবত অ্যারেটি উদাহরণস্বরূপ ধারণ করেছে যেগুলি বদলাচ্ছে না, সুতরাং সঠিক কোডটি "রেক্টক্লাসআরেই [321] = রেক্টক্লাসআরে [456]; ...; রেক্টক্লাসআরে [321] = নতুন রেক্টক্লাস (রেক্টক্লাসআরে [321 ]); রেক্টক্লাসআরে [321]। এক্স = 555; " কোনটি করণীয় তা জানতে, রেক্টক্লাস সম্পর্কে উভয়কে আরও অনেক কিছু জানতে হবে (উদাহরণস্বরূপ, এটি কোনও অনুলিপি নির্মাণকারী, একটি অনুলিপি পদ্ধতি ইত্যাদি সমর্থন করে) does ) এবং অ্যারের উদ্দেশ্য ব্যবহার স্ট্রাক ব্যবহারের মতো পরিষ্কার আর কোথাও নেই।

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

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


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

আপনি যা দেখিয়েছেন তা হ'ল একটি নিখুঁত উদাহরণে আপনি বিশ্বাস করেন যে একটি পদ্ধতি আরও পরিষ্কার। যদি আমরা আপনার উদাহরণটি সাথে Rectangleরাখি তবে আমি খুব সহজেই একটি সাধারণ সাইট নিয়ে আসতে পারি যেখানে আপনি অত্যন্ত অস্পষ্ট আচরণ পান। বিবেচনা করুন যে উইনফর্মগুলি Rectangleফর্মের Boundsসম্পত্তিতে ব্যবহৃত একটি পরিবর্তনীয় প্রকার প্রয়োগ করে । আমি যদি সীমানা পরিবর্তন করতে চাই তবে আমি আপনার সুন্দর বাক্যবিন্যাসটি ব্যবহার করতে চাই: form.Bounds.X = 10;তবে এটি ফর্মের কিছুটা স্পষ্টভাবে পরিবর্তন করে না (এবং আপনাকে এগুলি সম্পর্কে অবহিত করে একটি সুন্দর ত্রুটি উত্পন্ন করে)। অসঙ্গতি হ'ল প্রোগ্রামিং নিষ্ক্রিয় এবং এজন্য অপরিবর্তনীয়তা চাওয়া হয়।
রন ওয়ারহলিক

3
Warholic @Ron: BTW, আমি চাই চাই বলে পাবে "form.Bounds.X = 10;" এবং এটি কেবল কাজ করুন, কিন্তু সিস্টেম এটি করার কোনও পরিষ্কার উপায় সরবরাহ করে না। কল-ব্যাক গ্রহণের পদ্ধতি হিসাবে মান ধরণের বৈশিষ্ট্যগুলি প্রকাশ করার জন্য একটি সম্মেলন ক্লাসগুলি ব্যবহার করে যে কোনও পদ্ধতির চেয়ে অনেক ক্লিনার, দক্ষ এবং নিশ্চিতভাবে সঠিক কোড দিতে পারে।
সুপারক্যাট

4
এই উত্তরটি কয়েকটি শীর্ষ-ভোট প্রাপ্ত উত্তরের চেয়ে অনেক বেশি অন্তর্দৃষ্টিপূর্ণ। এটি এক ধরণের অযৌক্তিক বিষয় যে আপনি পরিবর্তনের সাথে সাথে মিউটেশনের সাথে মিশ্রণের সময় পরিবর্তনীয় মান ধরণের বিরুদ্ধে যুক্তি "আপনি কী আশা করেন" হওয়ার ধারণার উপর নির্ভর করে। এটি কোনওভাবেই করা ভয়ানক জিনিস !
ইমন নেরবোনে

2
@ সুপের্যাট: কে জানে, তারা হয়ত সি # 7 এর জন্য যে রিফ-রিটার্ন বৈশিষ্ট্যটির কথা বলছেন তা হয়ত সেই বেসটি আবরণ করতে পারে (আমি আসলে এটিকে বিস্তারিতভাবে দেখিনি, তবে এটি অতিমাত্রায় অনুরূপ মনে হয়)।
ইমন নের্বোন

24

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

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

আশা করি এটি আপনার কাছে কোনও অর্থবোধ করে। এটি নিশ্চিত হওয়ার জন্য আপনি ব্যবহারিক বিশদর চেয়ে মান ধরণের সাথে ক্যাপচার করার চেষ্টাটি সম্পর্কে আরও বেশি।


ভাল, তাদের অপরিবর্তনীয় ধারণার প্রতিনিধিত্ব করা উচিত , কমপক্ষে ;
মার্ক গ্র্যাভেল

3
ঠিক আছে, আমি মনে করি তারা সিস্টেম.ড্রেইং.পয়েন্টটি পরিবর্তনহীন করতে পারত তবে এটি একটি গুরুতর ডিজাইনের ত্রুটি IMHO হত। আমি মনে করি পয়েন্টগুলি আসলে একটি প্রত্নতাত্ত্বিক মান ধরণের এবং সেগুলি পরিবর্তনযোগ্য। এবং সত্যিকারের প্রাথমিক প্রোগ্রামিং 101 টি প্রাথমিকের বাইরেও তারা কারও জন্য কোনও সমস্যা সৃষ্টি করে না।
স্টিফেন মার্টিন

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

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

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

19

অন্যান্য কয়েকটি কোণার মামলা রয়েছে যা প্রোগ্রামারের দৃষ্টিকোণ থেকে অনির্দেশ্য আচরণের দিকে পরিচালিত করতে পারে।

অপরিবর্তনীয় মান প্রকার এবং কেবল পাঠযোগ্য ক্ষেত্র

    // Simple mutable structure. 
    // Method IncrementI mutates current state.
    struct Mutable
    {
        public Mutable(int i) : this() 
        {
            I = i;
        }

        public void IncrementI() { I++; }

        public int I { get; private set; }
    }

    // Simple class that contains Mutable structure
    // as readonly field
    class SomeClass 
    {
        public readonly Mutable mutable = new Mutable(5);
    }

    // Simple class that contains Mutable structure
    // as ordinary (non-readonly) field
    class AnotherClass 
    {
        public Mutable mutable = new Mutable(5);
    }

    class Program
    {
        void Main()
        {
            // Case 1. Mutable readonly field
            var someClass = new SomeClass();
            someClass.mutable.IncrementI();
            // still 5, not 6, because SomeClass.mutable field is readonly
            // and compiler creates temporary copy every time when you trying to
            // access this field
            Console.WriteLine(someClass.mutable.I);

            // Case 2. Mutable ordinary field
            var anotherClass = new AnotherClass();
            anotherClass.mutable.IncrementI();

            // Prints 6, because AnotherClass.mutable field is not readonly
            Console.WriteLine(anotherClass.mutable.I);
        }
    }

পরিবর্তনীয় মান ধরণের এবং অ্যারে

ধরুন আমাদের Mutableস্ট্রাক্টের একটি অ্যারে রয়েছে এবং আমরা IncrementIসেই অ্যারের প্রথম উপাদানটির জন্য পদ্ধতিটি কল করছি । আপনি এই কলটি থেকে কী আচরণের প্রত্যাশা করছেন? এটির অ্যারের মান বা কেবল একটি অনুলিপি পরিবর্তন করা উচিত?

    Mutable[] arrayOfMutables = new Mutable[1];
    arrayOfMutables[0] = new Mutable(5);

    // Now we actually accessing reference to the first element
    // without making any additional copy
    arrayOfMutables[0].IncrementI();

    // Prints 6!!
    Console.WriteLine(arrayOfMutables[0].I);

    // Every array implements IList<T> interface
    IList<Mutable> listOfMutables = arrayOfMutables;

    // But accessing values through this interface lead
    // to different behavior: IList indexer returns a copy
    // instead of an managed reference
    listOfMutables[0].IncrementI(); // Should change I to 7

    // Nope! we still have 6, because previous line of code
    // mutate a copy instead of a list value
    Console.WriteLine(listOfMutables[0].I);

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


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

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

@ সাহুয়াগিন: দুর্ভাগ্যক্রমে, এমন কোনও মানদণ্ড নেই যা দ্বারা কোনও ইন্টারফেস রেফারেন্স প্রকাশ করতে পারে। উপায় আছে। নেট এই জাতীয় জিনিসগুলি নিরাপদে এবং কার্যকরভাবে করার অনুমতি দিতে পারে (যেমন একটি T[]এবং একটি পূর্ণসংখ্য সূচকযুক্ত একটি বিশেষ "অ্যারেআরএফ <T>" স্ট্রাক্ট সংজ্ঞায়িত করে , এবং প্রদান করে যে প্রকারের কোনও সংস্থার অ্যাক্সেস ArrayRef<T>হিসাবে ব্যাখ্যা করা হবে) উপযুক্ত অ্যারে উপাদানটিতে অ্যাক্সেস) [যদি কোনও শ্রেণি ArrayRef<T>অন্য কোনও উদ্দেশ্যে কোনও প্রকাশ করতে চায় তবে এটি পুনরুদ্ধার করার জন্য কোনও পদ্ধতি - কোনও সম্পত্তির বিপরীতে সরবরাহ করতে পারে]। দুর্ভাগ্যক্রমে, এ জাতীয় কোনও বিধান নেই।
সুপারক্যাট

2
ওহ আমার ... এটি পরিবর্তনীয় স্ট্রাইকগুলি খারাপ ক্ষতি করে!
নওফাল

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

18

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

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


কাঠামোর ধরণের শ্রেণিবদ্ধ ক্ষেত্রগুলি প্রায়শই একটি খুব দরকারী প্যাটার্ন হতে পারে, যদিও স্বীকৃত কিছু সীমাবদ্ধতা রয়েছে। যদি ক্ষেত্রের পরিবর্তে বা ব্যবহারের চেয়ে বৈশিষ্ট্যগুলি ব্যবহার করে তবে পারফরম্যান্স হ্রাস পাবে readonlybut তবে যদি কেউ কাঠামোগত ধরণের শ্রেণীর ক্ষেত্রগুলি ঠিক করে থাকে things কাঠামোগুলির একমাত্র সত্যিকারের মৌলিক সীমাবদ্ধতা হ'ল পরিবর্তিত শ্রেণির ধরণের কাঠামো ক্ষেত্রটি int[]পরিচয় বা অপরিবর্তিত মানের একটি সেটকে আবদ্ধ করতে পারে তবে অযাচিত পরিচয়কে আবদ্ধ না করে পরিবর্তিত মানগুলিকে আবদ্ধ করতে ব্যবহার করা যায় না।
সুপারক্যাট

13

আপনি যদি স্ট্রাইকগুলি সি (সি #, ভিজ্যুয়াল বেসিক 6, পাস্কাল / ডেল্ফি, সি ++ স্ট্রাক্ট টাইপ (বা ক্লাসে) পয়েন্টার হিসাবে ব্যবহার না করে থাকেন তবে আপনি যদি দেখতে পান যে কোনও কাঠামো যৌগিক পরিবর্তনশীলের চেয়ে বেশি নয় find । এর অর্থ: আপনি এগুলিকে একটি সাধারণ নামের অধীনে (একটি রেকর্ড ভেরিয়েবল যার মাধ্যমে আপনি সদস্যদের রেফারেন্স করেন) ভেরিয়েবলের প্যাকড সেট হিসাবে বিবেচনা করবেন।

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

হ্যাঁ: স্ট্রোকগুলি প্রচুর স্মৃতিতে জড়িত, তবে এটি করার মাধ্যমে এটি আরও বেশি স্মৃতি হবে না:

point.x = point.x + 1

তুলনা করা:

point = Point(point.x + 1, point.y)

অবিচ্ছিন্ন ক্ষেত্রে মেমরির খরচ কমপক্ষে একই, বা আরও বেশি হবে (যদিও ভাষাটি নির্ভর করে বর্তমান স্ট্যাকের ক্ষেত্রে সেই ক্ষেত্রে সাময়িক হবে)।

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

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

তারা মন্দ নয়। এগুলি কেবল সঠিক উদ্দেশ্যে ব্যবহার করুন।

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


12

কল্পনা করুন আপনার 1,000,000 স্ট্রকের একটি অ্যারে রয়েছে। বিড_প্রাইস, অফার_প্রাইস (সম্ভবত দশমিক) এবং এর মতো স্টাফ সহ ইক্যুইটি প্রতিনিধিত্বকারী প্রতিটি স্ট্রাক্ট, এটি সি # / ভিবি দ্বারা তৈরি করা হয়েছে।

কল্পনা করুন যে অ্যারেটি পরিচালনা না করা .ੇਰগুলিতে বরাদ্দকৃত মেমরির একটি ব্লকে তৈরি করা হয়েছে যাতে কিছু অন্যান্য নেটিভ কোড থ্রেড একই সাথে অ্যারে অ্যাক্সেস করতে সক্ষম হয় (সম্ভবত কিছু উচ্চ-পারফ কোড গণিত করছেন)।

কল্পনা করুন যে সি # / ভিবি কোডটি দামের পরিবর্তনের বাজার ফিড শুনছে, সেই কোডটিতে অ্যারের কিছু উপাদান অ্যাক্সেস করতে পারে (যে কোনও সুরক্ষার জন্য) এবং তারপরে কিছু মূল্যের ক্ষেত্র (গুলি) সংশোধন করতে হবে।

কল্পনা করুন এটি প্রতি সেকেন্ডে দশ বা এমনকি কয়েক হাজার কয়েক বার করা হচ্ছে।

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

হুগো


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

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

9

যখন কোনও কিছুর পরিবর্তন করা যায়, তখন এটি পরিচয়ের অনুভূতি অর্জন করে।

struct Person {
    public string name; // mutable
    public Point position = new Point(0, 0); // mutable

    public Person(string name, Point position) { ... }
}

Person eric = new Person("Eric Lippert", new Point(4, 2));

কারণ Personপরিবর্তনযোগ্য, এরিকের ক্লোনিং করা, ক্লোনটি সরানো এবং আসলটি ধ্বংস করার চেয়ে এরিকের অবস্থান পরিবর্তন করার বিষয়ে চিন্তা করা আরও স্বাভাবিক । উভয় ক্রিয়াকলাপের বিষয়বস্তু পরিবর্তন করতে সফল হবে eric.position, তবে একটি অপরটির চেয়ে স্বজ্ঞাত। তেমনি, এরিককে সংশোধন করার পদ্ধতিগুলির চারপাশে (রেফারেন্স হিসাবে) পাস করা আরও স্বজ্ঞাত। এরিকের ক্লোন একটি পদ্ধতি দেওয়া প্রায় সবসময়ই অবাক হয়ে যায়। যে কেউ পরিবর্তন Personকরতে চায় তাকে অবশ্যই একটি রেফারেন্স জিজ্ঞাসা করতে হবে Personবা তারা ভুল কাজটি করবে।

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

  • অপরিবর্তনীয়
  • রেফারেন্স প্রকার
  • মান দ্বারা পাস নিরাপদ

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

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

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


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

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

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

6

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


3
এটি সত্য যদি আপনি কোনও মানচিত্রে কী হিসাবে কোনও শ্রেণীও ব্যবহার করেন।
মার্ক Gravell

6

ব্যক্তিগতভাবে যখন আমি কোডটি দেখি তখন নীচেরগুলি আমার কাছে বেশ চমত্কার দেখায়:

ডেটা.ভালিউ.সেট (ডেটা.ভ্যালু.জেট () + 1);

বরং সরল

ডেটা.ভ্যালু ++; বা ডেটা.ভ্যালু = ডেটা.ভ্যালু + 1;

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

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

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


1
সোজা কথা! স্ট্রাকচারগুলি অ্যাক্সেস নিয়ন্ত্রণ বিধিনিষেধ ছাড়াই সংগঠনের ইউনিট! দুর্ভাগ্যক্রমে, সি # এই উদ্দেশ্যে তাদের অকেজো করে দিয়েছে!
থান্ডারগ্রি

এটি উভয় উদাহরণে পারস্পরিক পরিবর্তনযোগ্য স্ট্রাক্ট দেখায় এটি পুরোপুরি বিন্দুটিকে মিস করে।
vidtige

সি # এই উদ্দেশ্যে তাদের অকেজো করেছে কারণ এটি কাঠামোগুলির উদ্দেশ্য নয়
লুইজ ফিলিপ

6

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

  1. একটি স্ট্রাক্টে কেবল সর্বজনীন সদস্য থাকার কথা এবং এটির জন্য কোনও এনক্যাপসুলেশন প্রয়োজন হয় না। যদি এটি হয় তবে তা আসলে একটি প্রকার / শ্রেণি হওয়া উচিত। আপনার একই কথা বলতে সত্যিই দুটি কনস্ট্রাক্টের দরকার নেই।

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

একটি যথাযথ বাস্তবায়ন নিম্নরূপ হবে।

struct Mutable {
public int x;
}

class Test {
    private Mutable m = new Mutable();
    public int mutate()
    { 
        m.x = m.x + 1;
        return m.x;
    }
  }
  static void Main(string[] args) {
        Test t = new Test();
        System.Console.WriteLine(t.mutate());
        System.Console.WriteLine(t.mutate());
        System.Console.WriteLine(t.mutate());
    }

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

ভয়েলা পরিবর্তনের ফলাফল প্রত্যাশার সাথে আচরণ করে:

1 2 3 চালিয়ে যেতে কোনও কী টিপুন। । ।


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

5

পরিবর্তনীয় ডেটাগুলির অনেক সুবিধা এবং অসুবিধা রয়েছে। মিলিয়ন-ডলারের অসুবিধা হ্রাস পাচ্ছে। একই মানটি যদি একাধিক জায়গায় ব্যবহার করা হয় এবং তাদের মধ্যে একটির এটির পরিবর্তন হয় তবে এটি এটি ব্যবহার করছে এমন অন্যান্য জায়গাগুলিতে যাদুবিদ্যার পরিবর্তে প্রদর্শিত হবে। এটি বর্ণ সম্পর্কিত অবস্থার সাথে সম্পর্কিত তবে একই নয়।

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

দ্য ইন্টারপ্রিটারের আর্ট এই ট্রেডগুলিতে কিছু বিশদভাবে যায় এবং কিছু উদাহরণ দেয়।


স্ট্রাইক সি # তে আলাদা করা হয় না। প্রতিটি স্ট্রাক্ট অ্যাসাইনমেন্ট একটি অনুলিপি।
পুনরাবৃত্তি

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

1

আমি বিশ্বাস করি না যদি তারা সঠিকভাবে ব্যবহার করা হয় তবে তারা মন্দ। আমি এটি আমার প্রোডাকশন কোডে রাখি না, তবে আমি স্ট্রাকচার্ড ইউনিট টেস্টিং মকগুলির মতো এমন কিছু চাই যেখানে স্ট্রাক্টটির আয়ু তুলনামূলকভাবে ছোট is

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

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


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

... যার স্পষ্টত কোনও শব্দার্থবিজ্ঞান নেই "প্রতিটি ক্ষেত্রের কাছে এটি লেখা শেষ জিনিস রয়েছে", স্ট্রাক্টকে আরও কিছু করার চেষ্টা করার চেয়ে কাঠামোগত ব্যবহার করে কোডটিতে সমস্ত শব্দার্থককে পুশ করে । উদাহরণস্বরূপ, Range<T>সদস্যদের Minimumএবং Maximumপ্রকারের ক্ষেত্রগুলির সাথে একটি ধরণ Tএবং কোড Range<double> myRange = foo.getRange();, কী Minimumএবং কী Maximumরয়েছে সেগুলি সম্পর্কে কোনও গ্যারান্টি উপস্থিত হওয়া উচিত foo.GetRange();। রয়ে Rangeএকটি উন্মুক্ত মাঠের struct হয় স্পষ্ট যে এটা তার নিজস্ব কোনো আচরণ যোগ করতে যাচ্ছে তুলবে হও।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.