আপনি যদি কেবল কোনও পদ্ধতিতে কল করার জন্য ঘন ঘন কোনও অবজেক্ট তৈরি করে থাকেন তবে এটি কী কোডের গন্ধ?


14

আমি একটি কোড বেস উত্তরাধিকারসূত্রে পেয়েছি যেখানে প্রচুর কোড রয়েছে যা এরকম কিছু হয়:

SomeDataAdapter sda = new SomeDataAdapter();
sda.UpdateData(DataTable updateData);

এবং তারপর এসডিএ আর কখনও ব্যবহার করা হয় না।

এটি কি কোনও কোডের গন্ধ যা ইঙ্গিত দেয় যে সেই পদ্ধতিগুলি পরিবর্তে স্থিত শ্রেণির পদ্ধতি হওয়া উচিত?


এই ক্লাসগুলি কোনও ইন্টারফেস প্রয়োগ করে?
এএকটিএইচিউলুলার Re

7
স্থির পদ্ধতিতে আপনি রিফ্যাক্টরের পরের দিনটি আপনার ডেটা অ্যাডাপ্টারের একটি বিদ্রূপিত সংস্করণ সহ ইউনিট পরীক্ষা চালাতে চান।
মাইক

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

9
আমার মতে, এটি একটি ভাষার গন্ধ যা "সবকিছু অবশ্যই একটি শ্রেণির হতে হবে" বিশ্লেষণের দুর্বলতা দেখায়।
বেন

7
টুইটার
কেভিন 21

উত্তর:


1

আমি এটিকে আর্কিটেকচারের গন্ধ হিসাবে বিবেচনা করব যে আপডেটডেটা সম্ভবত কোনও 'পরিষেবা' শ্রেণীর অন্তর্গত।

যেখানে ডেটা একটি অ্যাপল। যেখানে অ্যাপলএডাপ্টার হ'ল পরিষেবা / ব্যবসায়-বুদ্ধি শ্রেণি। যেখানে আপেলস সার্ভিস হ'ল একটি অ্যাপলএডাপ্টারের একক রেফারেন্স যা বর্তমান পদ্ধতির বাইরে রয়েছে exists

private static volatile AppleAdapter _appleService = null;
private static object _appleServiceLock = new object();
private AppleAdapter AppleService
{
    get
    {
        if (_appleService == null)
        {
            lock (_appleServiceLock)
            {
                if (_appleService == null)
                    _appleService = new AppleAdapter();
            }
        }
        return _appleService;
    }
}

public SomeAppleRelatedMethod(Apple apple)
{
    AppleService.UpdateData(apple);
}

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

তুমি কি জান? যদি সোমারডেটাএডাপ্টার কোনও এডিও আইডিবিডাটা অ্যাডাপ্টার হয় (যা এটি প্রায় অবশ্যই) তবে এই পুরো প্রতিক্রিয়াটিকে উপেক্ষা করুন!

: P: P

আমার কাছে মূল প্রশ্নের সাথে একটি মন্তব্য যুক্ত করার অনুমতি নেই, তবে আপনি যদি এই কোডটি বিদ্যমান তা নির্দিষ্ট করতে পারেন।

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


12
সাহায্য করুন! আমি সফটওয়্যার নিদর্শন ডুবে আছি।
রবার্ট হার্ভে

4
... বা নির্ভরতা হিসাবে ইনজেকশনের। ;)
রব

12
সাধারণ ফাংশন / পদ্ধতির সমতুল্য কিছু পাওয়ার জন্য সিঙ্গলটনের সাথে ডাবল-চেক লকিংয়ের সাথে জগাখিচুড়ি করা আমার কাছে অনেক বড় কোডের গন্ধ!
বেন

3

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


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

1

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

যদি এই সমস্ত বস্তুর কোনওটিই অন্য কার্যক্রমে যুক্তি হিসাবে পাস না হয়, আপনি এগুলি স্থিতিশীল পদ্ধতিতে পরিণত করতে পারেন এবং কিছুই পরিবর্তন হবে না nothing


এর অর্থ এইও হতে পারে যে আপনি স্থিতিশীল পদ্ধতিটি চান যে কোনও বস্তুর কাছে আপনি যাচ্ছেন তার একটি পরিবর্তিত সংস্করণ (বা একটি পরিবর্তিত অনুলিপি) ফিরিয়ে আনবে।
রবার্ট হার্ভে

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

4
@ জর্জিও তাত্ত্বিকভাবে, না। বাস্তবে, যদি আপনার ভাষায় না অন্তত এটা জন্য একটি বাক্য গঠন চিনি আছে, এটা পার্থক্য fn x => x + 1এবং new Function<Integer, Integer>() { public Integer eval(Integer x) { return x + 1; }};বা কয়েক হার্ড কোডেড এবং একটুর জন্য-দরকারী ফাংশন নিজেকে সীমিত।
ডোভাল

fn x => x + 1সিনট্যাকটিক চিনির জন্য কেন হতে পারে না new Function<Integer, Integer>() { public Integer eval(Integer x) { return x + 1; }}? ঠিক আছে, সম্ভবত আপনি বোঝাতে চাইছেন যে কেউ যদি এই জাতীয় সিনট্যাকটিক চিনি ছাড়া কোনও ভাষায় আটকে থাকে।
জর্জিও

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

0

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


0

"ঘন ঘন" সংজ্ঞা দিন। কিভাবে প্রায়ই আপনি বস্তুর instantiate করেন? অনেক - সম্ভবত না?

আপনার সিস্টেমে উদ্বিগ্ন হওয়ার জন্য আরও বড় সমস্যা রয়েছে। স্থির হয়ে যাওয়া প্রোগ্রামারের সাথে আরও স্পষ্টভাবে যোগাযোগ করবে যে বস্তুর অভ্যন্তরীণ অবস্থা পরিবর্তন হচ্ছে না - দুর্দান্ত।

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

হ্যাঁ এটি একটি কোডের গন্ধ, কেবল একটি ছোট্ট।


0

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


0

এখানে গন্ধটি হ'ল এটি হ'ল প্রক্রিয়াজাতীয় কোডগুলি বস্তুগুলিতে মোড়ানো (সর্বনিম্ন)।

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

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

সুতরাং এখানে মূল গন্ধটি হ'ল লেখক ক্লাসগুলি ব্যবহার করছেন, সম্ভবত কোনও ধারণাগত মডেল হিসাবে ক্রিয়াকলাপকে সংগঠিত না করেই সংকলকটির এটি প্রয়োজন requires

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

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