জাভা, জাভাস্ক্রিপ্ট, এবং সি # এর মতো মেমরি-পরিচালিত ভাষাগুলি কেন `নতুন` কীওয়ার্ডটি ধরে রেখেছে?


138

newজাভা, জাভাস্ক্রীপ্ট, এবং C # মত ভাষায় শব্দ একটি বর্গ একটি নতুন দৃষ্টান্ত সৃষ্টি করে।

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

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

f = Foo()

প্রথমে, এটি আমার কাছে কিছুটা বন্ধ মনে হয়েছিল, যতক্ষণ না এটি ঘটেছিল যে পাইথনের কোনও কারণ নেই newকারণ সবকিছুই একটি বস্তু তাই বিভিন্ন কনস্ট্রাক্টর সিনট্যাক্সের মধ্যে বিভ্রান্ত করার দরকার নেই।

কিন্তু তখন আমি ভাবলাম - newজাভাতে আসলেই কী লাভ? আমরা কেন বলব Object o = new Object();? শুধু কেন নয় Object o = Object();? সি ++ তে অবশ্যই একটি প্রয়োজনীয়তা রয়েছে new, যেহেতু আমাদের স্তূপে বরাদ্দ এবং স্ট্যাকের বরাদ্দের মধ্যে পার্থক্য করা দরকার, তবে জাভাতে সমস্ত বস্তু গাদাতে নির্মিত হয়, তবে newকীওয়ার্ডটি কেন ? একই প্রশ্ন জাভাস্ক্রিপ্ট জন্য জিজ্ঞাসা করা যেতে পারে। সি # তে, যার সাথে আমি খুব কম পরিচিত, আমার মনে newহয় অবজেক্টের ধরণ এবং মানের ধরণের মধ্যে পার্থক্য করার ক্ষেত্রে কিছু উদ্দেশ্য থাকতে পারে তবে আমি নিশ্চিত নই।

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

প্রশ্ন: আমি কি এ সম্পর্কে সঠিক? বা এমন কিছু বাধ্যতামূলক কারণ রয়েছে যা জা new+, জাভাস্ক্রিপ্ট এবং সি # এর মতো অনুপ্রেরণামূলক মেমরি-পরিচালিত ভাষাগুলিতে সি ++ তে থাকা প্রয়োজন তবে পাইথন নয়?


13
প্রশ্নটি বরং যে কোনও ভাষার newকীওয়ার্ড রয়েছে। অবশ্যই আমি একটি নতুন ভেরিয়েবল, বোকা সংকলক তৈরি করতে চাই! একটি ভাল ভাষা আমার মতে মত একটি বাক্য গঠন হবে f = heap Foo(), f = auto Foo()

7
একটি খুব গুরুত্বপূর্ণ বিষয় বিবেচনা করার বিষয় হ'ল কোনও ভাষা নতুন প্রোগ্রামারদের কাছে কতটা পরিচিত দেখাচ্ছে। জাভা স্পষ্টভাবে সি / সি ++ প্রোগ্রামারদের সাথে পরিচিত হওয়ার জন্য ডিজাইন করা হয়েছিল।

1
@ লন্ডিন: এটি সত্যই সংকলক প্রযুক্তির ফলাফল। একটি আধুনিক সংকলক এমনকি ইঙ্গিতের প্রয়োজন হবে না; এটি সেই ভেরিয়েবলের প্রকৃত ব্যবহারের ভিত্তিতে অবজেক্টটি কোথায় রাখবে তা নির্ধারণ করবে। fঅর্থাত্ যখন ফাংশনটি এড়ায় না, স্ট্যাকের স্থান বরাদ্দ করুন।
এমসাল্টারস

3
@ লন্ডিন: এটি করতে পারে এবং বাস্তবে আধুনিক জেভিএমও করতে পারে। এটি কেবল প্রমাণ করার বিষয় যে fবেষ্টনী ফাংশন ফিরে আসলে জিসি বস্তু সংগ্রহ করতে পারে ।
এমসাল্টার্স

1
কোনও ভাষা কেন সেভাবে ডিজাইন করা হয়েছে তা জিজ্ঞাসাবাদী নয়, বিশেষ করে যদি সেই নকশাটি কোনও সুস্পষ্ট সুবিধার জন্য চারটি অতিরিক্ত অক্ষর টাইপ করতে বলে? আমি কী মিস করছি?
ম্যাট্রিক্সফ্রোগ

উত্তর:


93

আপনার পর্যবেক্ষণগুলি সঠিক। সি ++ একটি জটিল জন্তু এবং newকীওয়ার্ডটি deleteপরে প্রয়োজনীয় কিছু এবং স্বয়ংক্রিয়ভাবে পুনরায় দাবি করা এমন কিছুর মধ্যে পার্থক্য করতে ব্যবহৃত হয়েছিল । জাভা এবং সি # তে তারা deleteকীওয়ার্ডটি ফেলে দিয়েছে কারণ আবর্জনা সংগ্রহকারী আপনার জন্য এটি যত্ন নেবে।

তাহলে সমস্যাটি কেন তারা newকীওয়ার্ডটি রেখেছিলেন? ভাষাগুলি লিখেছেন এমন লোকদের সাথে কথা না বলে এগুলির উত্তর দেওয়া এক ধরণের কঠিন। আমার সেরা অনুমানগুলি নীচে তালিকাভুক্ত করা হয়েছে:

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

এর ব্যবহারে রুবি পাইথন এবং জাভা / সি # এর মাঝে রয়েছে new। মূলত আপনি এর মতো কোনও বস্তু ইনস্ট্যান্ট করুন:

f = Foo.new()

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


5
রুবি সিনট্যাক্স দেখতে সুন্দর এবং সামঞ্জস্যপূর্ণ! নতুন C # শব্দ একটি হিসাবে ব্যবহার করা হয় জেনেরিক টাইপ বাধ্যতা একটি ডিফল্ট কন্সট্রাকটর সঙ্গে একটি টাইপ জন্য।
স্টিভেন জিউরিস

3
হ্যাঁ. আমরা যদিও জেনেরিকদের বিষয়ে কথা বলব না। উভয় জাভা এবং সি # এর জেনেরিক সংস্করণ খুব অবসন্ন। সি ++ না বলা যদিও বোঝা অনেক সহজ। জেনেরিক্সগুলি কেবলমাত্র স্ট্যাটিকালি টাইপ করা ভাষার জন্যই কার্যকর। পাইথন, রুবি এবং স্মলটালকের মতো গতিময়ভাবে টাইপ করা ভাষাগুলির কেবল তাদের প্রয়োজন নেই।
বেরিন লরিটস

2
ডেলফির রুবির সাথে একই রকম বাক্য গঠন রয়েছে, কেবল কনস্ট্রাক্টররা সাধারণত (তবে কেবলমাত্র ভায় কনভেনশন) বলা হয় ক্রিয়েট (`f: = TFoo.Create (param1, param2 ...) '
গেরি

অবজেক্টিভ-সি-তে, allocপদ্ধতিটি (রুবির মতো প্রায় একই জিনিস new) এছাড়াও একটি শ্রেণিবদ্ধ পদ্ধতি।
মিপাদি

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

86

সংক্ষেপে, আপনি ঠিক বলেছেন। জাভা এবং সি # এর মতো ভাষাতে নতুন কীওয়ার্ড অতিরিক্ত অতিরিক্ত। ব্রুস ইকেলের কিছু অন্তর্দৃষ্টি এখানে রয়েছে যারা 1990 এর দশকে সি ++ স্ট্যান্ডার্ড কমিটির সদস্য ছিলেন এবং পরে জাভাতে প্রকাশিত বইগুলি: http://www.artima.com/weblogs/viewpost.jsp?thread=260578

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

জাভা প্রবেশ করুন, সি -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ এখানে বিদ্রূপটি হ'ল জাভা স্ট্যাক বরাদ্দ ফেলে দেওয়ার সিদ্ধান্ত নিতে পেরেছিল এবং (আমি অন্যত্র সম্বোধন করে আদিমদের হতাশাকে উপেক্ষা করে)। এবং যেহেতু সমস্ত বস্তু গাদাতে বরাদ্দ করা হয়েছে, তাই স্ট্যাক এবং গাদা বরাদ্দের মধ্যে পার্থক্য করার দরকার নেই। তারা সহজেই Cat x = Cat () বা Cat x = Cat ("mittens") বলতে পারত। বা আরও ভাল, পুনরাবৃত্তি দূর করার জন্য সংযুক্ত প্রকারের সূচনা (তবে এটি - এবং ক্লোজারগুলির মতো অন্যান্য বৈশিষ্ট্যগুলি "খুব দীর্ঘ" গ্রহণ করতে পারত তাই আমরা পরিবর্তে জাভার মধ্যম সংস্করণটির সাথে আটকে থাকি; প্রকারের অনুমানটি আলোচনা করা হয়েছে তবে আমি করব প্রতিক্রিয়া রাখুন এটি হবে না। এবং জাভাতে নতুন বৈশিষ্ট্য যুক্ত করার ক্ষেত্রে সমস্যাটি দেওয়া উচিত নয়)।


2
স্ট্যাক বনাম হিপ ... অন্তর্দৃষ্টিপূর্ণ, এটি কখনই ভাবেনি।
ওয়ার্নারসিডি

1
"প্রকারের অনুমানটি আলোচনা করা হয়েছে তবে আমি প্রতিকূলতা প্রকাশ করব এটি ঘটবে না।", :) ঠিক আছে, জাভা এর বিকাশ এখনও এগিয়ে যায়। আকর্ষণীয় বিষয় এটি যদিও জাভা 10 এর একমাত্র ফ্ল্যাগশিপ। varশব্দ কোথাও হিসাবে ভাল হিসাবে পাসে autoসি ++, কিন্তু আমি আশা করি এটা উন্নত করতে হবে।
দেশপ্রেমিক

15

আমি ভাবতে পারি এর দুটি কারণ রয়েছে:

  • new একটি বস্তু এবং একটি আদিম মধ্যে পার্থক্য
  • newসিনট্যাক্স একটি বিট আরো পাঠযোগ্য (আইএমও)

প্রথমটি তুচ্ছ। আমি মনে করি না যে দু'দিককে দু'দিক থেকে আলাদা করে বলা খুব শক্ত। দ্বিতীয়টি ওপি'র পয়েন্টের উদাহরণ, এটি হ'ল newঅপ্রয়োজনীয় of

নাম স্পেস বিরোধ থাকতে পারে, যদিও; বিবেচনা:

public class Foo {
   Foo() {
      // Constructor
   }
}

public class Bar {
   public static void main(String[] args) {
      Foo f = Foo();
   }

   public Foo Foo() {
      return Foo();
   }
}

আপনি, কল্পনাশক্তি খুব বেশি প্রসারিত ছাড়াই সহজেই অসীম পুনরাবৃত্তি কল দিয়ে শেষ করতে পারেন। সংকলকটিকে "অবজেক্ট হিসাবে একই ফাংশন নাম" ত্রুটি প্রয়োগ করতে হবে। এটি সত্যই ক্ষতিগ্রস্থ করবে না, তবে এটি ব্যবহার করা আরও সহজ new, যা বলে যে, Go to the object of the same name as this method and use the method that matches this signature.জাভা পার্স করার জন্য খুব সহজ ভাষা এবং আমি সন্দেহ করি যে এই অঞ্চলে এই সহায়তা রয়েছে।


1
এটি অন্য যে কোনও অসীম পুনরাবৃত্তির থেকে আলাদা কীভাবে?
ডেডএমজি

এটি ঘটতে পারে এমন একটি খারাপ কাজটির মোটামুটি ভাল চিত্রণ, যদিও এটি বিকাশকারী যে কিছু গুরুতর মানসিক সমস্যা থাকতে পারে।
Tjaart

10

জাভা, একটির জন্য, এখনও সি ++ এর দ্বৈতত্ত্ব রয়েছে: বেশিরভাগ কিছুই একটি বস্তু নয়। জাভা অন্তর্নির্মিত ধরনের (যেমন, charএবং int) রয়েছে যা গতিশীলভাবে বরাদ্দ করতে হবে না।

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

আমি জাভা ডিজাইনের মানের (বা এর অভাব, কেস যেমন হতে পারে) এর অর্থ কী তা বোঝাতে বাধা দেব (আবারও) ref


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

9

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


4

মজার বিষয় হল, ভিবি এর দরকার নেই - এর মধ্যে পার্থক্য

Dim f As Foo

যা এটি নির্ধারণ না করে একটি ভেরিয়েবল ঘোষণা করে, Foo f;সি # এর সমতুল্য এবং

Dim f As New Foo()

যা ভেরিয়েবল ঘোষণা করে এবং শ্রেণীর একটি নতুন উদাহরণ নির্ধারণ করে, var f = new Foo();সি # এর সমতুল্য , এটি একটি পৃথক পার্থক্য। প্রাক-নেট ভিবিতে, আপনি এমনকি ব্যবহার করতে পারেন Dim f As Fooবা Dim f As New Foo- কারণ কনস্ট্রাক্টরগুলিতে কোনও ওভারলোডিং ছিল না।


4
ভিবি শর্টহ্যান্ড সংস্করণ প্রয়োজন নেই , এটি কেবল একটি সংক্ষেপণ। আপনি টাইপ এবং কনস্ট্রাক্টরের সাথে দীর্ঘতর সংস্করণ লিখতে পারেন যেমন দিম চ হিসাবে ফু = নতুন ফু ()। অপশন ইনফার অন দিয়ে, যা সি # এর ভারের সবচেয়ে নিকটতম জিনিস, আপনি Dim f = New Foo () লিখতে পারেন এবং সংকলকটি f এর ধরণের অনুমান করে।
MarkJ

2
... এবং Dim f As Foo()একটি ঘোষণা অ্যারে এর Fooগুলি। ওহ আনন্দ! :-)
হেইনজি

@ মারকজে: ভিবি.net তে শর্টহ্যান্ড সমান। Vb6 সালে, এটি ছিল না। ভিবি 6-তে, Dim Foo As New Barকার্যকরভাবে এমন Fooএকটি সম্পত্তি তৈরি করবে যা এটি নির্মাণের Barসময় তৈরি করবে (যেমন Nothing) পড়ার সময় । এই আচরণটি একবার ঘটানোর মধ্যেই সীমাবদ্ধ ছিল না; সেট Fooকরা Nothingএবং তারপরে এটি পড়ার ফলে আরও একটি নতুন সৃষ্টি হবে Bar
সুপারক্যাট

4

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


4
যুক্তিযুক্তভাবে, এটি জানার একটি খারাপ চিহ্ন a
ডেডএমজি

1
@ ডিড এমএমজি: "যুক্তিযুক্ত" অর্থ "বারটি বন্ধ না হওয়া পর্যন্ত আমি তর্ক করব" ...
ডোনাল ফেলো

3

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

আমি জাভাস্ক্রিপ্ট এবং সি # তেমনভাবে বলতে পারি না, তবে আমি newসি ++ ছাড়া জাভাতে আর কোনও কারণ দেখতে পাচ্ছি না ।


আমি মনে করি জাভা স্ক্রিপ্টটি "জাভার মতো দেখতে" যতটা সম্ভব ডিজাইনের জন্য তৈরি করা হয়েছিল, এমনকি যখন এটি জাভা-জাতীয় কোনও কাজ করছে না তখনও। x = new Y()জাভাস্ক্রিপ্ট মধ্যে নেই instantiateY বর্গ, কারণ জাভাস্ক্রিপ্ট নেই আছে ক্লাস। তবে এটি জাভার মতো দেখায় তাই এটি newজাভা থেকে মূল শব্দটি বহন করে , যা অবশ্যই এটি সি ++ থেকে এগিয়ে নিয়ে যায়।
ম্যাট্রিক্সফ্রোগ

ভাঙা সুইচের জন্য +1 (আশা করি আপনি এটি মেরামত করছেন: ডি)।
মার্টিনাস

3

সি # তে এটি প্রাসঙ্গিক ক্ষেত্রে প্রকারভেদগুলিকে মঞ্জুরি দেয় যেখানে তারা কোনও সদস্য দ্বারা অস্পষ্ট হতে পারে। এর সাহায্যে আপনি কোনও প্রকারের মতো একই নামে একটি সম্পত্তি রাখতে পারবেন। নিম্নোক্ত বিবেচনা কর,

class Address { 
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
}

class Person {
    public string Name { get; set; }
    public Address Address { get; set; }

    public void ChangeStreet(string newStreet) {
        Address = new Address { 
            Street = newStreet, 
            City = Address.City,
            State = Address.State,
            Zip = Address.Zip
        };
    }
}

ব্যবহারের নোট newএটা স্পষ্ট যে হতে পারবেন Addressহয় Addressটাইপ না Addressসদস্য। এটি কোনও সদস্যকে তার প্রকারের মতো একই নাম রাখতে দেয়। এটি বাদ দিয়ে নামের সংঘর্ষ এড়াতে আপনাকে টাইপের নামটির উপসীকরণ করতে হবে CAddress। এটি খুব ইচ্ছাকৃত ছিল কারণ আন্ডারস কখনই হানি শিরোনাম বা অনুরূপ কিছু পছন্দ করেন নি এবং সি # কে এটি ছাড়া ব্যবহারযোগ্য হতে চান। এটি যে পরিচিত ছিল তা ছিল একটি ডাবল বোনাস।


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

আমি অবাক হই যে তারা "নতুন" এর পরিবর্তে "নতুন" ব্যবহার করে না। কেউ তাদের বলতে পারে এখানে ছোট হাতের অক্ষরও রয়েছে, যা এই ধরণের সমস্যার সমাধান করে।
maarartinus

সি উদ্ভূত ভাষার সমস্ত সংরক্ষিত শব্দ, যেমন সি #, লোয়ার কেস। অস্পষ্টতা এড়াতে ব্যাকরণের এখানে একটি সংরক্ষিত শব্দের প্রয়োজন, এভাবে "নতুন" এর পরিবর্তে "নতুন" ব্যবহার করা উচিত।
চকজ

@gbjbaanb- গন্ধ নেই। আপনি কোনও প্রকার, সম্পত্তি / সদস্য বা কোনও ফাংশন উল্লেখ করছেন কিনা তা সর্বদা সম্পূর্ণ পরিষ্কার। আসল গন্ধটি আপনি যখন কোনও শ্রেণিটির মতো একটি নেমস্পেসের নাম রাখেন। MyClass.MyClass
স্টিফেন

0

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


4
আপনি কি ফরোয়ার্ড করবেন ? শেষ পর্যন্ত, কোনওভাবে std::shared_ptr<int> foo();কল করতে হবে new int
এমসাল্টারস

0

জাভা ডিজাইনারদের মনে এটি ছিল কিনা তা আমি নিশ্চিত নই তবে আপনি যখন বস্তুকে পুনরাবৃত্ত রেকর্ড হিসাবে মনে করেন , তখন আপনি কল্পনা করতে পারেন যে Foo(123)কোনও বস্তু ফেরত দেয় না তবে এমন একটি ফাংশন যার ফিক্সপয়েন্টটি অবজেক্টটি তৈরি হচ্ছে (যেমন ফাংশন যা ফিরে আসবে) বস্তুটি যদি এটি তৈরি করা হচ্ছে তর্ক হিসাবে দেওয়া হয়) constructed এবং এর উদ্দেশ্য newহ'ল "গিঁট বাঁধা" এবং সেই স্থির অবস্থানটি ফিরে আসা return অন্য কথায় newএটি "অবজেক্ট-টু-হতে" সচেতন করবে self

এই ধরণের পদ্ধতির উত্তরাধিকার আনুষ্ঠানিককরণে সহায়তা করতে পারে উদাহরণস্বরূপ: আপনি অন্য অবজেক্ট-ফাংশন দিয়ে কোনও অবজেক্ট-ফাংশন প্রসারিত করতে পারেন এবং শেষ পর্যন্ত এগুলি selfব্যবহার করে সাধারণ সরবরাহ করতে পারেন new:

cp = new (Colored("Blue") & Line(0, 0, 100, 100))

এখানে &দুটি অবজেক্ট-ফাংশন একত্রিত করা হয়।

এই ক্ষেত্রে newহিসাবে সংজ্ঞায়িত করা যেতে পারে:

def new(objectFunction) {
    actualObject = objectFunction(actualObject)
    return actualObject
}

-2

'শূন্য' অনুমতি দেওয়া।

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

সি ++ তে একটি লাইনের মতো

Person me;

তাত্ক্ষণিকভাবে ডিফল্ট কনস্ট্রাক্টর কল করবে।


4
উম, কি ভুল Person me = Nilবা থাকার Person meডিফল্টরূপে নীল হতে হবে এবং ব্যবহার Person me = Person()অ নীল জন্য? আমার বক্তব্যটি হ'ল মনে হচ্ছে না যে নীল এই সিদ্ধান্তের একটি কারণ ছিল ...
Andres F.

তোমার একটা কথা আছে ব্যক্তি আমাকে = ব্যক্তি (); সমানভাবে ভাল কাজ করবে।
ক্রিস ভ্যান বায়েল

@AndresF। অথবা Person meশূন্য হওয়া এবং Person me()ডিফল্ট নির্মাণকারীকে অনুরোধ করার সাথে আরও সহজ । সুতরাং যে কোনও কিছুর জন্য আপনার সর্বদা প্রথম বন্ধনীর প্রয়োজন হবে এবং এইভাবে একটি সি ++ অনিয়ম থেকে মুক্তি পান।
মার্টিনাস

-2

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

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


-4

আসলে জাভাতে স্ট্রিংস ব্যবহার করার সময় একটি পার্থক্য রয়েছে:

String myString = "myString";

এর থেকে আলাদা

String myString = new String("myString");

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

এর অর্থ হ'ল নতুনটি আশ্বাস দেয় যে বস্তুটি গুরুর সেই বিশেষ অঞ্চলে তৈরি হয়েছে, সাধারণ বস্তুর তত্বাবধানের জন্য বরাদ্দ করা হয়েছে, তবে এটি ছাড়া অবজেক্টগুলিকে ইনস্ট্যান্ট করার অন্যান্য উপায়ও থাকতে পারে; উপরেরটি একটি উদাহরণ, এবং এক্সটেনসিবিলিটির জন্য জায়গা বাকি আছে।


2
কিন্তু এই প্রশ্ন ছিল না। প্রশ্ন ছিল "কেন নয় String myString = String("myString");?" (মূলশব্দটির অনুপস্থিতিতে দ্রষ্টব্য new)
অ্যান্ড্রেস এফ।

@AndresF। প্রকৃত imho ধরনের ... স্ট্রিং নামের একটি পদ্ধতি থাকা বৈধ যে একটি স্ট্রিং ক্লাসে একটি স্ট্রিং দেয় এবং এটি কল করা এবং কনস্ট্রাক্টরকে কল করার মধ্যে পার্থক্য থাকতে পারে। এর মতো কিছুclass MyClass { public MyClass() {} public MyClass MyClass() {return null;} public void doSomething { MyClass myClass = MyClass();}} //which is it, constructor or method?
m3th0dman

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

2
দুঃখিত, আমি আপনার যুক্তি অনুসরণ করি না। আপনি কার্যকরভাবে তর্ক করছেন সিনট্যাক্স , শব্দার্থবিদ্যা না এবং যাহাই হউক না কেন প্রশ্ন সম্পর্কে ছিল newজন্য পরিচালিত ভাষায় । আমি দেখিয়েছি যে newএকেবারেই প্রয়োজন হয় না (যেমন স্কেলা কেস ক্লাসগুলির জন্য এটির প্রয়োজন হয় না) এবং কোনও অস্পষ্টতাও নেই (যেহেতু আপনার MyClassক্লাসে নামকরণের পদ্ধতি MyClassকোনওভাবেই থাকতে পারে না )। নেই কোন অস্পষ্টতা জন্য String s = String("hello"); এটি নির্মাণকারী ছাড়া আর কিছুই হতে পারে না। এবং পরিশেষে, আমি একমত নই: বাক্যবিন্যাসটি বাড়ানোর এবং স্পষ্ট করার জন্য কোড কনভেনশন রয়েছে, যা নিয়ে আপনি বিতর্ক করছেন!
আন্দ্রেস এফ।

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

-8

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


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