পরামিতি হিসাবে আমাদের কাস্টম অবজেক্টগুলি এড়ানো উচিত?


49

ধরুন আমার কাছে কাস্টম অবজেক্ট রয়েছে, স্টুডেন্ট :

public class Student{
    public int _id;
    public String name;
    public int age;
    public float score;
}

এবং একটি ক্লাস, উইন্ডো , এটি কোনও শিক্ষার্থীর তথ্য প্রদর্শন করতে ব্যবহৃত হয় :

public class Window{
    public void showInfo(Student student);
}

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

public void showInfo(int _id, String name, int age, float score);

যাতে পৃথকভাবে উইন্ডোটি পরীক্ষা করা সহজ হয় :

showInfo(123, "abc", 45, 6.7);

তবে আমি দেখেছি পরিবর্তিত সংস্করণে আরও একটি সমস্যা রয়েছে:

  1. শিক্ষার্থী সংশোধন করুন (যেমন: নতুন বৈশিষ্ট্য যুক্ত করুন) শো-ইনফো-এর পদ্ধতি-স্বাক্ষর সংশোধন করা দরকার

  2. শিক্ষার্থীর যদি অনেক সম্পত্তি থাকে তবে শিক্ষার্থীর পদ্ধতি-স্বাক্ষরটি দীর্ঘ হবে।

সুতরাং, কাস্টম অবজেক্টগুলিকে প্যারামিটার হিসাবে ব্যবহার করে বা প্রতিটি সম্পত্তিকে প্যারামিটার হিসাবে গ্রহণ করুন, কোনটি আরও রক্ষণাবেক্ষণযোগ্য?


40
এবং আপনার 'উন্নত' এর showInfoজন্য একটি সত্যিকারের স্ট্রিং, একটি আসল ফ্লোট এবং দুটি আসল ইনস্ট দরকার। সত্যিকারের Stringবস্তু সরবরাহের চেয়ে কীভাবে একটি বাস্তব Studentঅবজেক্ট সরবরাহ করা যায়?
বার্ট ভ্যান ইনজেন শেহেনো

28
সরাসরি পরামিতিগুলি পাস করার সাথে একটি বড় সমস্যা: আপনার এখন দুটি intপরামিতি রয়েছে। কল সাইট থেকে, কোনও সত্যায়িত নেই যে আপনি তাদেরকে যথাযথ ক্রমে উত্তীর্ণ করছেন। আপনি যদি অদলবদল করেন idএবং age, বা firstNameএবং lastName? আপনি ব্যর্থতা যে পর্যন্ত এটি আপনার মুখে আপ হাতাহাতি সনাক্ত করতে খুব কঠিন হতে পারে এর একটি সম্ভাব্য বিন্দু প্রবর্তন করছি, এবং আপনি এটা যোগ করছি প্রতি কলের সাইটে
ক্রিস হেইস

38
@ ক্রিসহেস আহ, পুরানো showForm(bool, bool, bool, bool, int)পদ্ধতি - আমি সেগুলিকে ভালবাসি ...
বরিস স্পাইডার

3
@ ক্রিসহেইস কমপক্ষে এটি জেএস নয় ...
জেনস স্কাউডার

2
পরীক্ষাগুলির একটি অপ্রত্যাশিত সম্পত্তি: যদি পরীক্ষায় আপনার নিজের অবজেক্ট তৈরি / ব্যবহার করা শক্ত হয় তবে আপনার এপিআই সম্ভবত কিছু কাজ ব্যবহার করতে পারে :)
eভি

উত্তর:


131

গোষ্ঠী সম্পর্কিত পরামিতিগুলিতে একটি কাস্টম অবজেক্ট ব্যবহার করা আসলে প্রস্তাবিত প্যাটার্ন। রিফ্যাক্টরিং হিসাবে, এটি পরিচিতি পরামিতি অবজেক্ট বলা হয় ।

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


14
যদি নতুন বস্তুটি সত্যিই যৌক্তিক গ্রুপিং না হয় তবে আপনি নিজেকে সমস্যায় ফেলতে পারবেন এমন সতর্কতা। প্রতিটি প্যারামিটারকে একক বস্তুতে সেট করার জুতোর চেষ্টা করবেন না; কেস ভিত্তিতে কেস নিয়ে সিদ্ধান্ত নিন। প্রশ্নের উদাহরণটি খুব ভালভাবে এর পক্ষে ভাল প্রার্থী হতে পারে বলে মনে হচ্ছে। Studentগ্রুপিং জ্ঞান করে তোলে এবং অ্যাপ্লিকেশান অন্যান্য এলাকায় আপ ক্রপ করতে পারে।
jpmc26

শিশুরূপে বলতে যদি আপনার ইতিমধ্যে অবজেক্ট থাকে তবে উদাহরণস্বরূপ Student, এটি
হ'ল

4
ডিমেটারের আইনটিও মনে রাখবেন । আঘাত হানতে একটি ভারসাম্য আছে তবে tldr না করা হয় a.b.cযদি আপনার পদ্ধতিটি নেয় a। যদি আপনার পদ্ধতিটি এমন পর্যায়ে পৌঁছে যায় যেখানে আপনার কাছে প্রায় 4 টির বেশি প্যারামিটার বা 2 স্তরের সম্পত্তির প্রবেশের গভীরতা থাকা দরকার, তবে সম্ভবত এটি ফ্যাক্টর করা দরকার। এছাড়াও নোট করুন যে এটি একটি গাইডলাইন - অন্যান্য সমস্ত দিকনির্দেশনার মতো এর জন্যও ব্যবহারকারীর বিচক্ষণতা প্রয়োজন। অন্ধভাবে এটি অনুসরণ করবেন না।
ড্যান প্যান্ট্রি

7
আমি এই উত্তরটির প্রথম বাক্যটি বিশ্লেষণ করা অত্যন্ত জটিল found
হেলরিচ

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

26

তুমি বলেছ

স্বতন্ত্রভাবে পরীক্ষা করা বেশ সহজ নয়, কারণ ফাংশনটি কল করার জন্য এটির সত্যিকারের শিক্ষার্থী অবজেক্টের প্রয়োজন

তবে আপনি কেবল আপনার উইন্ডোতে যাওয়ার জন্য একটি শিক্ষার্থী অবজেক্ট তৈরি করতে পারেন:

showInfo(new Student(123,"abc",45,6.7));

এটি কল করা আরও জটিল বলে মনে হচ্ছে না।


7
সমস্যা আসে যখন Studentএকটি বোঝায় Universityযা অনেক উল্লেখ করে, Facultys এবং Campus, s এর সাথে Professors এবং Buildingএস, কোনওটিই showInfoআসলে ব্যবহার করে, কিন্তু যদি আপনি কোন ইন্টারফেসে পরীক্ষা দেয় সংজ্ঞায়িত করা করেছি "জানি" যে ও সরবরাহ শুধুমাত্র প্রাসঙ্গিক ছাত্র পুরো সংস্থাটি তৈরি না করে ডেটা উদাহরণটি Studentএকটি সরল ডেটা অবজেক্ট এবং যেমনটি আপনি বলেন, পরীক্ষাগুলি এটির সাথে কাজ করে খুশি হওয়া উচিত।
স্টিভ জেসোপ

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

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

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

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

22

সাধারণ লোকের পদে:

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

সম্পাদনা:

হিসাবে @ Tom.Bowen89 যুক্তরাষ্ট্রের এটা অনেক বেশি জটিল ShowInfo পদ্ধতি পরীক্ষা করার জন্য নয়:

showInfo(new Student(8812372,"Peter Parker",16,8.9));

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

3

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

আমি কিছু বিবরণ ভুল পেয়ে থাকলে আমাকে ক্ষমা করুন, স্মৃতি থেকে কাজ করছি কারণ বইটিতে আমার অ্যাক্সেস হয়েছে এক বছর পেরিয়ে গেছে:

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

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

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


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

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

2

আপনি পুরো বস্তুটি পাস করলে পরীক্ষাগুলি লেখা এবং পড়া খুব সহজ is

public class AStudentView {
    @Test 
    public void displays_failing_grade_warning_when_a_student_with_a_failing_grade_is_shown() {
        StudentView view = aStudentView();
        view.show(aStudent().withAFailingGrade().build());
        Assert.that(view, displaysFailingGradeWarning());
    }

    private Matcher<StudentView> displaysFailingGradeWarning() {
        ...
    }
}

তুলনার জন্য,

view.show(aStudent().withAFailingGrade().build());

লাইনটি লেখা যেতে পারে, যদি আপনি পৃথকভাবে মানগুলি পাস করেন তবে:

showAStudentWithAFailingGrade(view);

যেখানে প্রকৃত পদ্ধতি কলটি কোথাও সমাহিত হয়

private showAStudentWithAFailingGrade(StudentView view) {
    int someId = .....
    String someName = .....
    int someAge = .....
    // why have been I peeking and poking values I don't care about
    decimal aFailingGrade = .....
    view.show(someId, someName, someAge, aFailingGrade);
}

কথাটি বলতে গেলে, আপনি পরীক্ষায় আসল পদ্ধতি কলটি রাখতে পারবেন না এটি এমন একটি চিহ্ন যা আপনার এপিআই খারাপ।


1

আপনার অর্থ কেটে যায় কিছু ধারণা:

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

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

আমি প্রধান অবজেক্টটি পাস করার বিষয়ে সর্বাধিক প্রবণতা পোষণ করব - কারণ আমি কীভাবে কোড করব এটি আরও সহজেই ব্যাখ্যা করবে যে এই ফাংশনটি কী করছে।


1

চারপাশের একটি সাধারণ রুট হল দুটি প্রক্রিয়ার মধ্যে একটি ইন্টারফেস sertোকানো।

public class Student {

    public int id;
    public String name;
    public int age;
    public float score;
}

interface HasInfo {
    public String getInfo();
}

public class StudentInfo implements HasInfo {
    final Student student;

    public StudentInfo(Student student) {
        this.student = student;
    }

    @Override
    public String getInfo() {
        return student.name;
    }

}

public class Window {

    public void showInfo(HasInfo info) {

    }
}

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

interface HasInfo {
    public String getInfo();
}

public class Student {

    public int id;
    public String name;
    public int age;
    public float score;

    public HasInfo getInfo() {
        return new HasInfo () {
            @Override
            public String getInfo() {
                return name;
            }

        };
    }
}

তারপরে আপনি Windowক্লাসটিকে কেবল একটি নকল HasInfoবস্তু দিয়ে পরীক্ষা করতে পারেন ।

আমি সন্দেহ করি এটি ডেকরেটর প্যাটার্নের একটি উদাহরণ ।

যোগ করা হয়েছে

কোডটির সরলতার কারণে কিছু বিভ্রান্তি দেখা দিয়েছে। এখানে আরও একটি উদাহরণ যা কৌশল আরও ভালভাবে প্রদর্শন করতে পারে।

interface Drawable {

    public void Draw(Pane pane);
}

/**
 * Student knows nothing about Window or Drawable.
 */
public class Student {

    public int id;
    public String name;
    public int age;
    public float score;
}

/**
 * DrawsStudents knows about both Students and Drawable (but not Window)
 */
public class DrawsStudents implements Drawable {

    private final Student subject;

    public DrawsStudents(Student subject) {
        this.subject = subject;
    }

    @Override
    public void Draw(Pane pane) {
        // Draw a Student on a Pane
    }

}

/**
 * Window only knows about Drawables.
 */
public class Window {

    public void showInfo(Drawable info) {

    }
}

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

@ কাই - রিটার্ন টাইপের জন্য Studentএবং Stringএখানে ব্যবহার নিখুঁতভাবে প্রদর্শনের জন্য। অঙ্কন করা হলে আঁকতে getInfoযেমন অতিরিক্ত পরামিতি থাকতে পারে Pane। এখানে ধারণাটি হ'ল মূল অবজেক্টের সজ্জক হিসাবে কার্যকরী উপাদানগুলি পাস করা
ওল্ড কার্মিউডজিয়ন

সেক্ষেত্রে আপনি আপনার ইউআই কাঠামোর সাথে ছাত্র সত্তাকে শক্তভাবে সংযুক্ত করছেন, এটি আরও খারাপ বলে মনে হচ্ছে ...
সার

1
@ কাই - একেবারে বিপরীত। আমার ইউআই কেবলমাত্র HasInfoঅবজেক্ট সম্পর্কে জানে । Studentএক হতে জানে।
ওল্ড কার্মিউডজিয়ন

যদি আপনি getInfoরিটার্ন শূন্যতার সাথে এটি Paneআঁকতে একটি পাস দেন, তবে বাস্তবায়ন ( Studentক্লাসে) হঠাৎ করে দোল বা আপনি যা ব্যবহার করছেন তা মিলিয়ে দেওয়া হবে। যদি আপনি এটিকে কিছু স্ট্রিং ফিরিয়ে দেন এবং 0 টি প্যারামিটার নেন, তবে আপনার ইউআই জাদু অনুমানগুলি এবং অন্তর্নিহিত সংযোজন ছাড়াই স্ট্রিংটির সাথে কী করতে হবে তা জানবে না। আপনি যদি getInfoসত্যই প্রাসঙ্গিক বৈশিষ্ট্যগুলির সাথে কিছু ভিউ মডেল ফিরিয়ে দেন তবে আপনার Studentক্লাসটি আবার উপস্থাপনার যুক্তিতে যুক্ত হয়। আমি মনে করি না যে এই বিকল্পগুলির কোনও পছন্দনীয়
সারা

1

আপনার কাছে ইতিমধ্যে প্রচুর ভাল উত্তর রয়েছে, তবে এখানে কয়েকটি আরও পরামর্শ যা আপনাকে বিকল্প সমাধান দেখার সুযোগ দিতে পারে:

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

  • আপনার মডেল বিষয়গুলির প্রাসঙ্গিক অংশগুলিকে ডেটা ট্রান্সফার অবজেক্টে স্থানান্তর করা আপনার মডেলটি খুব জটিল হয়ে উঠলে ইন্টারফেসিংয়ের জন্য একটি দরকারী পন্থা।

  • এটি হতে পারে যে আপনার ছাত্র ইন্টারফেস বিভাজন নীতি লঙ্ঘন করে। যদি তা হয়, তবে এটির সাথে কাজ করা সহজতর এমন একাধিক ইন্টারফেসে বিভক্ত করা সুবিধাজনক হতে পারে।

  • অলস লোডিং বড় অবজেক্ট গ্রাফগুলির নির্মাণকে আরও সহজ করে তুলতে পারে।


0

এটি আসলে একটি শালীন প্রশ্ন। এখানে আসল ইস্যুটি হল জেনেরিক শব্দ "অবজেক্ট" ব্যবহার করা, যা কিছুটা অস্পষ্ট হতে পারে।

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

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

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


1
রেফারেন্স পাস করা ব্যয়বহুল নয়, এমনকি যদি বস্তুটি কয়েক বিলিয়ন টেরাবাইট বৃহত হয় তবে রেফারেন্সটি এখনও বেশিরভাগ ভাষায় কেবল কোনও ইন্টার এর আকার। প্রাপ্তির পদ্ধতিটি খুব বড় একটি এপিআইর কাছে প্রকাশিত হয়েছে কিনা এবং আপনি যদি অযাচিত উপায়ে জিনিসগুলি জুড়ে দেন তবে আপনার আরও চিন্তা করা উচিত। আমি এমন একটি ম্যাপিং স্তর তৈরি করার বিষয়টি বিবেচনা করব যা ব্যবসায়িক বস্তুগুলিকে ( Student)গুলিকে ভিউ মডেলগুলিতে ( StudentInfoবা StudentInfoViewModelইত্যাদি) অনুবাদ করে তবে এটি প্রয়োজনীয় নাও হতে পারে।
সার

শ্রেণি এবং কাঠামো খুব আলাদা are একটি মান দ্বারা পাস করা হয় (যার অর্থ পদ্ধতিটি এটির একটি অনুলিপি পায় ) এবং অন্যটি রেফারেন্স দ্বারা পাস হয় (রিসিভারটি কেবলমাত্র মূলটির জন্য একটি পয়েন্টার পায়)। এই পার্থক্যটি না বোঝা বিপজ্জনক।
রাবারডাক

@ কাই আমি বুঝতে পারি যে একটি রেফারেন্স পাস করা ব্যয়বহুল নয়। আমি যা বলছি তা হ'ল এমন একটি ফাংশন তৈরি করা যাতে সম্পূর্ণ শ্রেণীর উদাহরণ প্রয়োজন class শ্রেণীর নির্ভরতা, তার পদ্ধতি ইত্যাদির উপর নির্ভর করে পরীক্ষা করা আরও কঠিন হতে পারে - যেহেতু আপনাকে কোনওরকমে এই শ্রেণীর উপহাস করতে হবে।
মধ্যাহ্নভোজ 3

আমি ব্যক্তিগতভাবে বাহ্যিক সিস্টেমগুলি (ফাইল / নেটওয়ার্ক আইও) অ্যাক্সেস করে এমন বাউন্ডারি ক্লাসগুলি (যেমন র্যান্ডম, সিস্টেম টাইম-ভিত্তিক, ইত্যাদি) অ্যাক্সেস করে এমন কিছু ব্যতীত ব্যঙ্গ করার পক্ষে। আমি যে ক্লাসটি পরীক্ষা করছি তার যদি নির্ভরতা থাকে যা বর্তমান বৈশিষ্ট্যটি পরীক্ষা করার সাথে সম্পর্কিত নয় তবে আমি যেখানে সম্ভব সেখানে কেবল পাস করতে পছন্দ করি। তবে আপনি যদি কোনও প্যারামিটার অবজেক্ট গ্রহণ করে এমন কোনও পদ্ধতি পরীক্ষা করে থাকেন, যদি সেই অবজেক্টের একগুচ্ছ নির্ভরতা থাকে তবে আমি সামগ্রিক নকশা সম্পর্কে উদ্বিগ্ন be এই জাতীয় জিনিসগুলি হালকা ওজনের হওয়া উচিত।
সারা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.