জাভাতে কখনও স্ট্রিংস ব্যবহার করবেন না? [বন্ধ]


73

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

public void bookTicket(
  String name,
  String firstName,
  String film,
  int count,
  String cinema);

public void bookTicket(
  Name name,
  FirstName firstName,
  Film film,
  Count count,
  Cinema cinema);

প্রোগ্রামিং ব্লগগুলি পড়ার আমার অভিজ্ঞতায় আমি এই সিদ্ধান্তে পৌঁছেছি যে 90% বোকা, তবে আমি এই ভেবে পেলাম যে এটি একটি বৈধ পয়েন্ট কিনা। একরকম এটি আমার কাছে ঠিক বোধ হয় না তবে প্রোগ্রামিংয়ের শৈলীতে যা ভুল তা আমি ঠিক বুঝতে পারি না।


মূল উইকির উপর প্রাসঙ্গিক আলোচনা: "এটি কী টস্ট্রিং ()?"
ক্রিস্টোফার হামার্সট্রিম

5
ওহ, বাহ এই ব্লগ পোস্টটি আমাকে শারীরিকভাবে অসুস্থ বোধ করিয়েছে
রব

5
আমি কমপক্ষে একটি বই (যা কোড কমপ্লিটের প্রথম সংস্করণ হতে পারে) পড়েছি যা আপনার সমস্ত আদিম ধরণের টাইডফাইটিংয়ের সমস্যা ডোমেন থেকে নাম রাখার পরামর্শ দিয়েছিল। একই ধারণা।
user16764

9
"কখনই নয়" দিয়ে শুরু হওয়া একটি বিবৃতি "সর্বদা" মিথ্যা!
ফ্লোরেন্টস তাসলাই

1
লোকটি সিটিও ?!
হ্যাঞ্জেলো

উত্তর:


88

আপনার প্রোগ্রামটি পরিবর্তনের বিরুদ্ধে রক্ষা করার জন্য এনক্যাপসুলেশন রয়েছে । একটি নামের প্রতিনিধিত্ব পরিবর্তন হতে চলেছে? যদি তা না হয় তবে আপনি নিজের সময় নষ্ট করছেন এবং YAGNI প্রযোজ্য।

সম্পাদনা: আমি ব্লগ পোস্টটি পড়েছি এবং তার মূল ধারণাটি রয়েছে। সমস্যাটি হ'ল তিনি এটিকে খুব দূরে সরিয়ে রেখেছেন। এর মতো String orderId কিছু সত্যই খারাপ, কারণ সম্ভবত "!"£$%^&*())ADAFVFএটি বৈধ নয় orderId। এর অর্থ এটি Stringবৈধ মানগুলির চেয়ে অনেক বেশি সম্ভাব্য মানের প্রতিনিধিত্ব করে orderId। যাইহোক, এর মতো কোনও কিছুর জন্য name, তবে আপনি সম্ভবত কোনটি বৈধ নাম হতে পারে বা নাও হতে পারে তা ভবিষ্যদ্বাণী করতে পারবেন না এবং Stringকোনওটি বৈধ name

প্রথম উদাহরণে, আপনি (সঠিকভাবে) কেবল বৈধগুলিতে সম্ভাব্য ইনপুটগুলি হ্রাস করছেন। দ্বিতীয় উদাহরণে, আপনি সম্ভাব্য বৈধ ইনপুটগুলির সংকীর্ণতা অর্জন করতে পারেন নি।

আবার সম্পাদনা করুন: অবৈধ ইনপুট ক্ষেত্রে বিবেচনা করুন। আপনি যদি নিজের নাম হিসাবে "গ্যারেথ গবুলকোক" লিখেন তবে এটি নির্বোধ দেখাচ্ছে, এটি বিশ্বের শেষ হতে যাচ্ছে না। যদি আপনি একটি অবৈধ অর্ডারআইডি রাখেন, সম্ভাবনা হ'ল এটি কার্যকরভাবে চলবে না।


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

13
@ ম্যালকম: তবে আপনার কাছে জানার উপায় নেই যে কোন স্ট্রিংগুলি বারবার যাচাই করা ছাড়া বৈধ।
ডেড এমএমজি

7
"[...] কোনওটি বৈধ নাম বা কী হতে পারে তা সম্ভবত আপনি ভবিষ্যদ্বাণী করতে পারবেন না এবং কোনও স্ট্রিংই একটি বৈধ নাম" " আমার ধারণা এই কৌশলটির একটি শক্তি হ'ল যদি আপনার প্যারামিটারটি টাইপ হয় তবে Nameআপনি দুর্ঘটনাক্রমে অন্য কোনও সম্পর্কযুক্ত স্ট্রিংয়ের মানটি পাস করতে পারবেন না। আপনি যেখানে একটি আশা করেন Name, কেবলমাত্র একটি Nameসংকলন করবে এবং স্ট্রিং "আমি আপনাকে $ 5 owণী" দুর্ঘটনাক্রমে গ্রহণযোগ্য হতে পারে না। (নোট করুন এটি কোনও প্রকারের নাম বৈধতার সাথে সম্পর্কিত নয়!)
অ্যান্ড্রেস এফ

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

3
@ ডেড এমজি এটি বিতর্কিত এবং আমরা মন্তব্যে সমাধান করতে পারি এমন কিছু নয়। আমি বলতে পারি যে আদিম ধরণের মানগুলি ভুলভাবে স্থাপন করা হয় এবং আপনার ইন্টারফেসকে শক্ত করা পরিস্থিতি উন্নতির এক উপায়
আন্দ্রেস এফ।

46

এটা ঠিক পাগল :)


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

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

12
সাধারণ জ্ঞান সাধারণ কিছু কিন্তু।
কাজ ড্রাগন

1
+1, এটিতে আমি যুক্ত করব যে কোনও ভাষা যখন নামকরণকৃত প্যারামিটারগুলি সমর্থন করে, এবং আইডিই ভাল হয়, সি # এবং ভিএস 2010 এর ক্ষেত্রে এটি তখন পাগল নিদর্শনগুলির সাথে ভাষার বৈশিষ্ট্যগুলির অভাবের জন্য কোনও ক্ষতিপূরণ দিতে হবে না । এক্স নামের ক্লাস এবং ওয়াই নামের একটি শ্রেণীর দরকার নেই, যদি কেউ var p = new Point(x: 10, y:20);এও লিখতে পারে তবে এটি সিনেমার মতো নয় যে স্ট্রিং থেকে আলাদা। আমি যদি বুঝতে পারি যে কেউ যদি শারীরিক পরিমাণে যেমন চাপ, তাপমাত্রা, শক্তি, যেখানে ইউনিটগুলি পৃথক করে এবং কিছু নেতিবাচক হতে না পারে তার সাথে ডিল করতে হয়। ব্লগের লেখকের কার্যকরী চেষ্টা করা দরকার।
কাজ

1
"অতিরিক্ত প্রকৌশলী করবেন না!" এর জন্য +1
ইভান

23

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


2
ডাউনভোটার কি মন্তব্য করতে পারবেন?
কেভিন লাইভ

স্ট্যাটিক টাইপিংয়ের জন্য আমরা কী উচ্চ মূল্য দিচ্ছি?
রিচার্ড টিঙ্গল

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

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

16

এটা করবেন না; এটি স্টাফকে অতিরিক্ত জটিল করে তুলবে এবং আপনার এটির দরকার নেই

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


উপকারিতা

সুবিধার মধ্যে প্রধান হ'ল কোডটি সংশোধন ও প্রসারিত করার ক্ষমতা । আপনি যদি ব্যবহার

class Point {
    int x,y;
    // other point operations
}

আশেপাশে কয়েকটি সংখ্যক পূর্ণসংখ্যার পরিবর্তে - যা এমন কিছু যা দুর্ভাগ্যক্রমে, অনেকগুলি ইন্টারফেস করে - তারপরে পরে আরও একটি মাত্রা যুক্ত করা আরও সহজ হয়ে যায়। বা টাইপ পরিবর্তন করুন double। আপনি যদি এর পরিবর্তে ব্যবহার করেন List<Author> authorsবা এর List<Person> authorsপরিবর্তে List<String> authorsকোনও লেখক যা উপস্থাপন করেন তাতে আরও তথ্য যুক্ত করা আরও সহজ হয়ে যায়। এটিকে এভাবে লিখলে মনে হয় আমি স্পষ্ট করে বলছি, তবে বাস্তবে আমি নিজে অনেকবার এইভাবে স্ট্রিং ব্যবহার করার জন্য দোষী হয়েছি, বিশেষত এমন ক্ষেত্রে যেখানে এটি শুরুতে সুস্পষ্ট ছিল না তখন আমার চেয়ে আরও বেশি প্রয়োজন একটি স্ট্রিং

আমি বর্তমানে কিছু স্ট্রিং লিস্টটি রিফ্যাক্টর করার চেষ্টা করছি যা আমার কোড জুড়ে জড়িত রয়েছে কারণ আমার আরও তথ্যের প্রয়োজন আছে, এবং আমি ব্যথা অনুভব করছি: \

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

চূড়ান্ত সুবিধাটি হ'ল ধরণের সুরক্ষা , স্পষ্ট কারণে, তবে আমার দৃষ্টিতে এটি এখানে একটি ছোটখাটো জিনিস।

অপূর্ণতা

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

এটি প্রচুর রিন্ডানডেন্ট সেটার (বা নির্মাণ) এবং গেটারদের জড়িত করতে পারে । ব্লগ লেখক new Point(x(10), y(10))পরিবর্তে এর সত্যই কুৎসিত উদাহরণ দেয় new Point(10, 10)এবং আমি যুক্ত করতে চাই যে কোনও ব্যবহারের Math.max(p.x.get(), p.y.get())পরিবর্তে জিনিসগুলিও জড়িত থাকতে পারে Math.max(p.x, p.y)। এবং লম্বা কোডটি প্রায়শই পড়তে শক্ত মনে করা হয় এবং ঠিক তাই। তবে সমস্ত সততার সাথে আমার মনে হয় প্রচুর কোডগুলি বস্তুর চারপাশে চলে আসে, এবং কেবলমাত্র নির্বাচিত পদ্ধতিগুলি এটি তৈরি করে এবং এর কম পরিমাণে বিশদ বিবরণে অল্প অ্যাক্সেসের প্রয়োজন হয় (যা যাইহোক ওওপি নয়)।

তর্কসাধ্য

আমি বলব যে এটি কোডের পঠনযোগ্যতার সাথে বিতর্কযোগ্য with হ্যাঁ, আরও শব্দাবদ্ধ তথ্য, তবে লম্বা কোড। হ্যাঁ, প্রতিটি স্থানীয় ভূমিকা বোঝা সহজ, তবে আপনি যদি না যান এবং এর ডকুমেন্টেশন না পড়েন তবে এটির সাথে আপনি কী করতে পারবেন তা বোঝা শক্ত।


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

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

আমার ওভার-ইঞ্জিনিয়ারড কোডটির প্রতি গভীর বিদ্বেষ রয়েছে। আমি সত্যিই করি। তবে সঠিকভাবে ব্যবহৃত হয়েছে, আমি এই ওভার ইঞ্জিনিয়ারিং মনে করি না।


5

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

এটি কেবল "সুরক্ষা" নয়, জাভা সম্পর্কে একটি দুর্দান্ত জিনিস হ'ল এটি আপনাকে প্রদত্ত লাইব্রেরি পদ্ধতিতে কী কল্পনা করে / প্রত্যাশা করে ঠিক তা স্মরণে / নির্ণয় করতে আপনাকে অনেক সহায়তা করে।

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

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

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

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

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


3

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

public void bookTicket(
  String name,
  String firstName,
  String film,
  int count,
  String cinema);

টিকিট বুকিং করা প্রকৃত পৃষ্ঠপোষককে নির্দিষ্ট করার জন্য দুটি প্যারামিটারের প্রয়োজন, আপনার অভিন্ন নাম (যেমন রিমেক) সহ দুটি ভিন্ন সিনেমা থাকতে পারে, আপনার বিভিন্ন নামের (যেমন অনুবাদ) একই মুভি থাকতে পারে। মুভি থিয়েটারগুলির একটি নির্দিষ্ট শৃঙ্খলে বিভিন্ন শাখা অফিস থাকতে পারে, সুতরাং আপনি কীভাবে এটির সাথে একটি স্ট্রিং এবং ধারাবাহিক উপায়ে মোকাবেলা করতে যাচ্ছেন (উদাহরণস্বরূপ আপনি কী ব্যবহার করছেন $chain ($city)বা $chain in $cityঅন্য কিছু এবং আপনি কীভাবে নিশ্চিত হন যে এটি কী ধারাবাহিকভাবে ব্যবহার করা হয়েছে: সবচেয়ে খারাপটি হ'ল দুটি প্যারামিটারের মাধ্যমে আপনার পৃষ্ঠপোষককে নির্দিষ্ট করে দিচ্ছে, প্রথম নাম এবং উপাধি উভয়ই বৈধ গ্রাহকের গ্যারান্টি দেয় না (এবং আপনি দুটি পার্থক্য করতে পারবেন না John Doe)।

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

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

প্রস্তাবিত বিকল্প আরও ভাল:

public void bookTicket(
  Name name,
  FirstName firstName,
  Film film,
  Count count,
  Cinema cinema);

অন্যদিকে, আমি মনে করি যে সমস্ত কিছু মোড়ানো নিয়ে ব্লগ পোস্টটি অনেক বেশি এগিয়ে যায়। Countখুব জেনারিক, আমি এটি দিয়ে আপেল বা কমলা গণনা করতে পারতাম, এগুলি যুক্ত করতে পারি এবং এখনও আমার হাতে এমন পরিস্থিতি রয়েছে যেখানে টাইপ সিস্টেমটি আমাকে অযৌক্তিক ক্রিয়াকলাপ করতে দেয়। আপনি অবশ্যই ব্লগের মতো একই যুক্তি প্রয়োগ করতে পারেন এবং প্রকারগুলি সংজ্ঞায়িত করতে পারেন CountOfOranges, তবে এটি সরল নির্বোধও।

এটি মূল্যবান জন্য, আমি আসলে কিছু লিখতে চাই

public Ticket bookTicket(
  Person patron,
  Film film,
  int numberOfTickets,
  Cinema cinema);

দীর্ঘ গল্প সংক্ষিপ্ত: আপনার অযৌক্তিক ভেরিয়েবলগুলি পাস করা উচিত নয়; আপনি যখন কোনও ক্যুরি (উদাহরণস্বরূপ public Collection<Film> findFilmsWithTitle(String title)) চালাচ্ছেন বা যখন আপনি প্রুফ-অফ-কনসেপ্টের সাথে একসাথে রাখছেন তখন আপনি যখন এমন কোনও মূল্যের সাথে আসল বস্তুটি নির্দিষ্ট করে যা প্রকৃত অবজেক্টটি নির্ধারণ করে না । আপনার টাইপ সিস্টেমটি পরিষ্কার রাখুন, সুতরাং এমন কোনও ধরণের ব্যবহার করবেন না যা খুব সাধারণ (উদাহরণস্বরূপ মুভিটি একটি দ্বারা উপস্থাপিত String) বা খুব সীমাবদ্ধ / নির্দিষ্ট / অবদানযুক্ত (যেমন Countপরিবর্তে int)) এমন এক ধরণের ব্যবহার করুন যা আপনার আইটেমটিকে অনন্য এবং দ্ব্যর্থহীনভাবে সংজ্ঞায়িত করে যখনই সম্ভব এবং টেকসই হবে।

সম্পাদনা করুন : আরও ছোট সংক্ষিপ্তসার। ছোট অ্যাপ্লিকেশনগুলির জন্য (যেমন ধারণার প্রমাণ): জটিল ডিজাইনের সাথে কেন বিরক্ত করবেন? কেবল ব্যবহার করুন Stringবা intএটির সাথে এগিয়ে যান।

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

আমি এনপ্যাপুলেটিং স্ট্রিংয়ের ধারণাটি অনুভব করি, ... এটি কেবল একটি ডিজাইন যা অসম্পূর্ণ: ছোট অ্যাপ্লিকেশনগুলির জন্য অতিরিক্ত জটিল, বড় অ্যাপ্লিকেশনগুলির জন্য পর্যাপ্ত নয়।


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

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

2

আমার কাছে এটি করা সি # তে অঞ্চল ব্যবহার করার মতো। সাধারণত যদি আপনি মনে করেন আপনার কোডটি পঠনযোগ্য করার জন্য এটি দরকার হয় তবে আপনার নিজের সময়টি ব্যয় করা উচিত আরও বড় সমস্যা have


2
কারণের চেয়ে লক্ষণগুলির চিকিত্সা বোঝাতে +1।
কাজ

2

আমি বলব এটি দৃ language়ভাবে টাইপড টাইপের মতো বৈশিষ্ট্যযুক্ত কোনও ভাষায় একটি সত্যই ভাল ধারণা।

জাভাতে আপনার এটি নেই তাই এই জিনিসগুলির জন্য পুরো নতুন ক্লাস তৈরি করার অর্থ ব্যয় সম্ভবত বেনিফিটের চেয়েও বেশি। আপনার পরিবর্তনশীল / পরামিতি নামকরণ সম্পর্কে সতর্ক হয়ে আপনি 80% সুবিধাও পেতে পারেন।


0

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

উদাহরণস্বরূপ যখন এটির "গুডনস" বৃদ্ধি পায়। সমস্ত নামের উপর বিধিনিষেধ।

তবে কিছু অ্যাপ তৈরি করার সময় (লাইব্রেরি নয়) এটির পুনঃঅ্যাক্টর করা সর্বদা সম্ভব possible তাই আমি এটি না করেই শুরু করার পছন্দ করি।


0

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


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