উদাহরণস্বরূপ সৃষ্টিটি কেন এটি হয়?


17

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

Person Bob = new Person();

এমন কোনও কারণ আছে যে বিষয়টি দুটিবার নির্দিষ্ট করা হয়েছে? কখনও কি একটি হবে something_else Bob = new Person()?

মনে হয় আমি যদি কনভেনশন থেকে এগিয়ে চলেছি তবে এটি আরও ভাল হবে:

int XIsAnInt;
Person BobIsAPerson;

অথবা সম্ভবত এর মধ্যে একটি:

Person() Bob;
new Person Bob;
new Person() Bob;
Bob = new Person();

আমি মনে করি "কৌতূহলী" এর চেয়ে ভাল উত্তর যদি "এটি ঠিক এভাবেই করা হয় তবে"।


26
ব্যক্তি যদি একটি উপপ্রকার হয় LivingThing? আপনি লিখতে পারে LivingThing lt = new Person()। দেখুন উত্তরাধিকার এবং ইন্টারফেস।
xlecoustillier

2
Person Bobএকটি ঘোষণা পরিবর্তনশীল "রেফারেন্স ধরনের Personবলা হয়" Bobnew Person()একটি Personবস্তু তৈরি করে । রেফারেন্স, ভেরিয়েবল এবং অবজেক্ট তিনটি আলাদা জিনিস!
ব্যবহারকারী 253751

5
অপ্রয়োজনে আপনি কি বিরক্ত? তাহলে কেন লিখবেন না var bob = new Person();?
200_suscess

4
Person Bob();সি ++ এ সম্ভব এবং এর প্রায় একই জিনিসটির অর্থ Person Bob = Person();
হ'ল

3
@ ব্যবহারকারীর 60561 না, এটি কোনও ফাংশন ঘোষণা করে যে কোনও যুক্তি না নিয়ে এবং ব্যক্তিকে ফিরিয়ে দেয়।
নিকোলাই

উত্তর:


52

কখনও কি এমন কিছু_বিহীন বব = নতুন ব্যক্তি () থাকবে?

হ্যাঁ, উত্তরাধিকারের কারণে। এমন:

public class StackExchangeMember : Person {}

তারপর:

Person bob = new StackExchangeMember();
Person sam = new Person();

ববও একজন ব্যক্তি, এবং গলির দ্বারা, তিনি অন্য কারও চেয়ে আলাদা আচরণ করতে চান না।

আরও, আমরা ববকে সুপার পাওয়ারের সাথে সমাপ্ত করতে পারি:

public interface IModerator { }
public class StackOverFlowModerator : StackExchangeMember, IModerator {}

IModerator bob = new StackOverFlowModerator();

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

StackExchangeMember bob = new StackOverFlowModerator();

তারপরে যখন তিনি কোনও খারাপ 1 ম পোস্টার খুঁজে পান, তখন তিনি তার অদৃশ্যতার পোশাকটি ছুঁড়ে ফেলে দেন।

((StackOverFlowModerator) bob).Smite(sam);

এবং তারপরে তিনি সমস্ত নির্দোষ এবং স্টাফের পরে কাজ করতে পারেন:

((Person) bob).ImNotMeanIWasJustInstantiatedThatWay();

20
আপনি যদি নিজের অবজেক্টের নামগুলি ছোট করে রাখেন তবে এটি অনেক পরিষ্কার হবে।
মনিকার সাথে লাইটনেস রেস

38
স্পেসিফিকেশন ভাল উদাহরণ; উত্তরাধিকার খারাপ উদাহরণ। এটি পড়ার অন্য কারও কাছে, দয়া করে উত্তরাধিকার ব্যবহার করে ব্যবহারকারীর ভূমিকাগুলি সমাধান করার চেষ্টা করবেন না।
Aaronaught

8
পছন্দ করুন বিভিন্ন ধরণের লোকের জন্য আলাদা ক্লাস তৈরি করবেন না। বিটফিল্ড ব্যবহার করুন enum
কোল জনসন

1
@ অ্যারোনট এটি কী করতে হবে তা খুব ভালভাবেই বলেছেন, তবে লোকেরা পরিবর্তে তাদের কী করা উচিত তা না বলাই খুব কার্যকর নয়।
ফারাপ

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

34

আসুন আপনার কোডের প্রথম লাইনটি নিয়ে তা পরীক্ষা করুন examine

Person Bob = new Person();

প্রথমটি Personএকটি ধরণের স্পেসিফিকেশন। সি # তে, আমরা কেবল এই কথাটি দিয়ে বিতরণ করতে পারি

var Bob = new Person();

এবং সংকলকটি কনস্ট্রাক্টর কল থেকে ভেরিয়েবল ববের ধরণটি নির্ধারণ করবে Person()

তবে আপনি এই জাতীয় কিছু লিখতে চাইতে পারেন:

IPerson Bob = new Person();

যেখানে আপনি ব্যক্তির সম্পূর্ণ এপিআই চুক্তিটি পূরণ করছেন না, তবে কেবল ইন্টারফেস দ্বারা নির্দিষ্ট চুক্তি IPerson


2
+1: আমি IPersonকোড লিখছি যখন আমি কোনও দুর্ঘটনাক্রমে কোনও ব্যক্তিগত পদ্ধতি ব্যবহার না করি তা নিশ্চিত করার জন্য আমি আমার কোডে উদাহরণটি করব যা অন্য কোনও IPersonপ্রয়োগে অনুলিপি / পাসটেবল হওয়া উচিত ।
কর্ট অ্যামোন - মনিকা

@ কর্টআ্যামমন আমার মনে হয় আপনার সেখানে একটি টাইপ রয়েছে, পরিষ্কারভাবে আপনি বোঝাতে চেয়েছিলেন "বহুবর্ষের সাথে কাজ করুন" বরং সেই কোডটিতে অনুলিপি / পাস্তেবলের চেয়ে: ডি
বেনজামিন গ্রুয়েনবাউম

@ বেনজামিন গ্রুয়েনবাউম নিশ্চিত, বহুবর্ষের কিছু সংজ্ঞার জন্য ;-)
কর্ট অ্যামোন - মনিকা

@ কর্টআমন আপনি কীভাবে দুর্ঘটনাক্রমে একটি ব্যক্তিগত পদ্ধতিতে কল করবেন ? নিশ্চয়ই আপনি বোঝাতে চেয়েছেন internal?
কোল জনসন

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

21
  1. এই বাক্য গঠনটি সি ++ থেকে প্রাপ্ত উত্তরাধিকারের মতো, যা হ'ল উভয়ই:

    Person Bob;

    এবং

    Person *bob = new Bob();

    বর্তমান স্কোপের মধ্যে প্রথম কোনও অবজেক্ট তৈরি করা, দ্বিতীয়টি গতিশীল অবজেক্টের জন্য পয়েন্টার তৈরি করা।

  2. আপনি অবশ্যই পেতে পারেন something_else Bob = new Person()

    IEnumerable<int> nums = new List<int>(){1,2,3,4}

    আপনি এখানে দুটি ভিন্ন জিনিস করছেন, স্থানীয় ভেরিয়েবলের প্রকার উল্লেখ করে numsএবং আপনি বলছেন যে আপনি 'তালিকা' টাইপটির একটি নতুন অবজেক্ট তৈরি করতে চান এবং এটি সেখানে রাখতে চান।

  3. সি # ধরণের আপনার সাথে একমত, কারণ বেশিরভাগ সময় ভেরিয়েবলের ধরণটি আপনি এতে রাখেন তেমনই একই হয়:

    var nums = new List<int>();
  4. কিছু ভাষায় আপনি F # এর মতো ভেরিয়েবলের প্রকার উল্লেখ না করার জন্য যথাসাধ্য চেষ্টা করেন :

    let list123 = [ 1; 2; 3 ]

5
এটি সম্ভবত আরও সঠিক যে আপনার দ্বিতীয় উদাহরণটি একটি নতুন বব অবজেক্টের জন্য একটি পয়েন্টার তৈরি করে। জিনিসগুলি যেভাবে সংরক্ষণ করা হয় তা প্রযুক্তিগতভাবে একটি বাস্তবায়ন বিশদ।
রবার্ট হার্ভে

4
"স্ট্যাকের উপরে স্থানীয় অবজেক্ট তৈরি করা প্রথম, দ্বিতীয় স্তূপে একটি বস্তু তৈরি করা।" ওহে মানুষ, এই ভুল তথ্য আবার না।
মনিকার সাথে লাইটনেস রেস

পছন্দ করুন
কে_

1
@ কে_ "গতিশীল" এর বেশিরভাগ অর্থ "হিপ" (যখন গাদা প্ল্যাটফর্মের দ্বারা ব্যবহৃত মেমরির মডেল হয়), "স্বয়ংক্রিয়" "স্ট্যাক" থেকে খুব আলাদা। যদি আপনি এটি করেন new std::pair<int, char>(), তবে সদস্য firstএবং secondজোড়ের সদস্যদের স্বয়ংক্রিয় স্টোরেজ সময়কাল থাকে তবে এগুলি সম্ভবত স্তূপে বরাদ্দ করা হয় (ডায়নামিক-স্টোরেজ-সময়কাল pairঅবজেক্টের সদস্য হিসাবে )।
মনিকা পুনরায়

1
@ ক্যাক: হ্যাঁ, এই নামগুলি স্পষ্টভাবে বোঝায় যে তারা কী বোঝাতে চাইছে , যদিও এই "স্ট্যাক" বনাম "হিপ" বাজে বাজে না । এটাই পুরো কথা। আপনি তাদেরকে বিভ্রান্তিকর বলে মনে করেন যে কেবল তাদের শিখিয়ে দেওয়ার জন্য আমাদের প্রয়োজনীয়তা জোরদার করে, যাতে আপনি কেবল এটি পরিচিত হওয়ার কারণে ভুল / ভুল পরিভাষার উপর নির্ভর করছেন না!
মনিকার সাথে লাইটনেস রেস

3

int xএবং এর মধ্যে বিশাল পার্থক্য রয়েছে Person bob। একটি intএকটি intহয় একটি intএবং এটি সর্বদা একটি হতে হবে intএবং এ ছাড়া কখনও কখনও আর কিছু হতে পারে না int। আপনি intযখন এটি ঘোষনা করার সময় আপনি আরম্ভ না করেন int x;তবুও intএটি ডিফল্ট মানের জন্য সেট।

Person bobযাইহোক, আপনি যখন ঘোষণা করেন যে নামটি bobকোনও নির্দিষ্ট সময়ে আসলে কী উল্লেখ করতে পারে সে সম্পর্কে অনেক নমনীয়তা রয়েছে । এটি একটি উল্লেখ করতে পারে Person, বা এটি Programmerথেকে উত্পন্ন অন্য কোনও শ্রেণির উল্লেখ করতে পারে Person; এটি এমনকি হতে পারে null, কোনও বস্তুর উল্লেখ নেই।

উদাহরণ স্বরূপ:

  Person bob   = null;
  Person carol = new Person();
  Person ted   = new Programmer();
  Person alice = personFactory.functionThatReturnsSomeKindOfPersonOrNull();

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


1

দুটি ঘোষণা পৃথক হতে পারে তবে প্রায়শই একই থাকে। জাভাতে একটি সাধারণ, প্রস্তাবিত প্যাটার্নটি দেখতে দেখতে:

List<String> list = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();

এই ভেরিয়েবল listএবং mapইন্টারফেস ব্যবহার ঘোষিত হয় Listএবং Mapকোড নির্দিষ্ট বাস্তবায়নের instantiates হয়েছে। এইভাবে, বাকী কোডটি কেবল ইন্টারফেসের উপর নির্ভর করে এবং ইনস্ট্যান্ট করতে বিভিন্ন বাস্তবায়ন ক্লাস বেছে নেওয়া সহজ, যেমন TreeMapবাকী কোডটি ইন্টারফেসের HashMapবাইরে থাকা এপিআইয়ের কোনও অংশের উপর নির্ভর করতে পারে না Map

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

প্রকারের অনুমানটি উত্স কোডের অপ্রয়োজনীয়তা ঠিক করতে পারে। যেমন জাভায়

List<String> listOne = Collections.emptyList();

অনুমান এবং ঘোষণা প্রকারের জন্য সঠিক ধরণের তালিকা তৈরি করবে

static <T> List<T> emptyList(); 

কিছু ভাষায়, টাইপ অনুমান আরও যায়, যেমন সি ++ এ

auto p = new Person();

বিটিডাব্লু জাভা ভাষা লোয়ার কেস আইডেন্টিফায়ার নামগুলি ব্যবহারের জন্য একটি শক্তিশালী কনভেনশন সেট করে, যেমন bobনা Bob। এটি অনেকটা অস্পষ্টতাকে এড়িয়ে যায় যেমন প্যাকেজ C ক্লাস বনাম ক্লাস।ভ্যারেবল।
জেরি 101

... এবং এই কারণেই আপনার আছে clazz
একটি সিভিএন

না, clazzব্যবহৃত হয় কারণ classএটি একটি কীওয়ার্ড তাই এটি সনাক্তকারী হিসাবে ব্যবহার করা যায় না।
জেরি 101

... নামকরণ কনভেনশনগুলি যেমন ছিল না তেমন কোনও সমস্যা হবে না। Classএকটি পুরোপুরি বৈধ সনাক্তকারী।
সিএওও

... যেমন আছে cLaSs, cLASSএবং cLASs
el.pescado

1

সাধারণ মানুষের কথায়:

  • ইনস্ট্যান্টেশন থেকে ঘোষণা পৃথক করা ডেকউল করতে সহায়তা করে যারা এই বস্তুগুলি কে তৈরি করে সেগুলি ব্যবহার করে
  • আপনি যখন এটি করেন, পলিপর্ফিিজম সক্ষম করা হয়, যতক্ষণ না তাত্ক্ষণিক ধরণের ঘোষণার ধরণের একটি সাব টাইপ থাকে ততক্ষণ ভেরিয়েবল ব্যবহার করে সমস্ত কোড কাজ করবে
  • দৃ strongly়ভাবে টাইপ করা ভাষায় আপনাকে অবশ্যই একটি ভেরিয়েবলের প্রকার উল্লেখ করে তা ঘোষণা করতে হবে, কেবলমাত্র var = new Process()আপনি প্রথমে ভেরিয়েবলটি ঘোষণা করছেন না।

0

এটি কী ঘটছে তার নিয়ন্ত্রণের স্তর সম্পর্কেও। যদি কোনও অবজেক্ট / ভেরিয়েবলের ঘোষণাটি স্বয়ংক্রিয়ভাবে কোনও কনস্ট্রাক্টরকে কল করে, উদাহরণস্বরূপ, যদি

Person somePerson;

স্বয়ংক্রিয়ভাবে একই ছিল

Person somePerson = new Person(blah, blah..);

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

এই উদাহরণে ব্যাখ্যা করা হয় জশুয়া ব্লচ এর কার্যকরী জাভা (আইটেম 1 ব্যঙ্গ করে যথেষ্ট!)


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

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