অনেকগুলি পৃথক স্থিতির প্রতিনিধিত্ব করে এমন একটি পূর্ণসংখ্যা কোডটি ফিরিয়ে ফাংশনটি পুনরায় কাজ করা


10

আমি কিছু ভয়ঙ্কর কোড পেয়েছি যা আমি নীচে একটি সংক্ষিপ্ত নমুনা অন্তর্ভুক্ত করেছি।

  • এই নির্দিষ্ট অ্যান্টি-প্যাটার্নটির কোনও নাম আছে?
  • এটি রিফ্যাক্টর জন্য কিছু সুপারিশ কি?

    // 0=Need to log in / present username and password
    // 2=Already logged in
    // 3=Inactive User found
    // 4=Valid User found-establish their session
    // 5=Valid User found with password change needed-establish their session
    // 6=Invalid User based on app login
    // 7=Invalid User based on network login
    // 8=User is from an non-approved remote address
    // 9=User account is locked
    // 10=Next failed login, the user account will be locked
    
    public int processLogin(HttpServletRequest request, HttpServletResponse response, 
                            int pwChangeDays, ServletContext ServContext) { 
    }
    

2
"প্রতিষ্ঠিত" এবং "প্রয়োজনীয় প্রতিষ্ঠিত" কী কী ?
তুলিনাস কর্ডোভা

4
এটি এম ড্যাশ হওয়ার কথা , "বৈধ ব্যবহারকারী পাওয়া গেছে: তাদের সেশনটি প্রতিষ্ঠা করুন" এর মতো পড়ুন।
বিজে মায়ার্স

2
@ এ_বি এই রিটার্ন মানগুলির মধ্যে কোনটি সফল লগইন যা ব্যর্থ লগইন। সকলেই স্ব-স্পষ্ট হয় না।
তুলিনাস কর্ডোভা

@ এ_বি "" তাদের অধিবেশনটি "প্রতিষ্ঠিত করার অর্থ কি" অধিবেশন স্থির "বা" একটি অধিবেশন স্থির প্রয়োজন "?
টুলাইনস কর্ডোভা

@ টুলিনস কর্ডোভা: "প্রতিষ্ঠা" এর অর্থ যতটা "তৈরি" হয় (কমপক্ষে এই প্রসঙ্গে) - সুতরাং "তাদের অধিবেশন প্রতিষ্ঠা করুন" প্রায় "তাদের অধিবেশন তৈরি করার" সমান
হফমলে

উত্তর:


22

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

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

public LoginResult processLogin(HttpServletRequest request, HttpServletResponse response, 
                            int pwChangeDays, ServletContext ServContext) { 
    }

==> লগইনআরসাল্ট.জভা <==

public enum LoginResult {
    NOT_LOGGED_IN(Severity.DENIAL),
    ALREADY_LOGGED_IN(Severity.PASS),
    INACTIVE_USER(Severity.DENIAL),
    VALID_USER(Severity.PASS),
    NEEDS_PASSWORD_CHANGE(Severity.WAIVER),
    INVALID_APP_USER(Severity.DENIAL),
    INVALID_NETWORK_USER(Severity.DENIAL),
    NON_APPROVED_ADDRESS(Severity.DENIAL),
    ACCOUNT_LOCKED(Severity.DENIAL),
    ACCOUNT_WILL_BE_LOCKED(Severity.WAIVER);

    private Severity severity;

    private LoginResult(Severity severity) {
        this.severity = severity;
    }

    public Severity getSeverity() {
        return this.severity;
    }
}

==> তীব্রতা.জভা <==

public enum Severity {
    PASS,
    WAIVER,
    DENIAL;
}

==> টেস্ট.জভা <==

public class Test {

    public static void main(String[] args) {
        for (LoginResult r: LoginResult.values()){
            System.out.println(r + " " +r.getSeverity());           
        }
    }
}

প্রতিটি লগইন ফলাফলের তীব্রতা প্রদর্শন করে টেস্ট.জভা এর আউটপুট:

NOT_LOGGED_IN : DENIAL
ALREADY_LOGGED_IN : PASS
INACTIVE_USER : DENIAL
VALID_USER : PASS
NEEDS_PASSWORD_CHANGE : WAIVER
INVALID_APP_USER : DENIAL
INVALID_NETWORK_USER : DENIAL
NON_APPROVED_ADDRESS : DENIAL
ACCOUNT_LOCKED : DENIAL
ACCOUNT_WILL_BE_LOCKED : WAIVER

এনাম মান এবং এর তীব্রতা উভয়ের উপর ভিত্তি করে, আপনি সিদ্ধান্ত নিতে পারেন যে সেশন তৈরিটি এগিয়ে যায় কিনা।

সম্পাদনা করুন:

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

  • পাস: এগিয়ে যান, একটি সেশন তৈরি করুন যদি ইতিমধ্যে উপস্থিত না থাকে
  • ওয়েভার: এবার এগিয়ে যান, তবে পরবর্তী সময় ব্যবহারকারীর আপনাকে পাস করার অনুমতি দেওয়া হতে পারে না
  • ডেনিয়াল: দুঃখিত, ব্যবহারকারী পাস করতে পারবেন না, একটি সেশন তৈরি করবেন না

আপনি এনুমে ত্রুটির মাত্রা এম্বেড করতে একটি "জটিল" এনুম (গুণাবলী সহ এনাম) তৈরি করতে পারেন। তবে সতর্কতা অবলম্বন করুন কারণ আপনি যদি সোমাল সিরিয়ালাইজেশন সরঞ্জামগুলি ব্যবহার করেন তবে এটি খুব ভালভাবে পাস করতে পারে না।
ওয়ালফ্রাট

ত্রুটির ক্ষেত্রে ব্যতিক্রমগুলি ছড়িয়ে দেওয়া এবং কেবল সাফল্যের জন্য এনামগুলিকে সংরক্ষণ করাও একটি বিকল্প।
টি। সার

@ টি.সর ওয়েল, যেমন আমি বুঝতে পেরেছিলাম যে সেগুলি প্রতি ত্রুটি নয় তবে কোনও কারণে একটি অধিবেশন তৈরি করতে অস্বীকার। আমি উত্তরটি সম্পাদনা করব।
তুলাইনস কর্ডোভা

@ টি.এসআর আমি পাসগুলি, ওয়েভার এবং ডেনিয়ালের সাথে মানগুলি পরিবর্তন করেছিলাম যাতে এটি পরিষ্কার হয়ে যায় যে আমি আগে যা ইআরআরআর বলেছিলাম এটি একটি বৈধ স্থিতি। সম্ভবত এখন আমার আরও ভাল নামটি নিয়ে আসা উচিতSeverity
তুলিনাস কর্ডোভা

আমি আমার পরামর্শ নিয়ে অন্য কিছু নিয়ে ভাবছিলাম, তবে আপনার পরামর্শটি আমি সত্যিই পছন্দ করেছি! আমি অবশ্যই একটি +1 ছুঁড়ে দিচ্ছি!
টি। সর

15

এটি আদিম আবেশের উদাহরণ - "সাধারণ" কাজের জন্য আদিম ধরণের ব্যবহার করে যা শেষ পর্যন্ত এত সহজ হয় না।

এটি boolসাফল্য বা ব্যর্থতার ইঙ্গিত দিতে কোড হিসাবে শুরু হয়ে থাকতে পারে int, তৃতীয় অবস্থার পরে একটিতে রূপান্তরিত হয়েছিল এবং অবশেষে নিকট-অনির্ধারিত ত্রুটি শর্তগুলির পুরো তালিকা হয়ে ওঠে।

এই সমস্যার জন্য সাধারণ রিফ্যাক্টরিং হ'ল একটি নতুন ক্লাস / স্ট্রাক্ট / এনাম / অবজেক্ট / যা কিছু যা প্রশ্নের উত্তরকে আরও ভালভাবে উপস্থাপন করতে পারে তা তৈরি করা। এই ক্ষেত্রে, আপনি enumফলাফলের শর্তাবলী এমন কোনওটিতে বা এমনকি boolসাফল্য বা ব্যর্থতার জন্য একটি ক্লাস , একটি ত্রুটি বার্তা, অতিরিক্ত তথ্য ইত্যাদি থাকতে পারে এমন একটি ক্লাসে স্যুইচ করতে বিবেচনা করতে পারেন might

আরও রিফ্যাক্টরিং নিদর্শনগুলির জন্য যা দরকারী হতে পারে তার জন্য, শিল্প লজিকের ঘ্রাণ থেকে রিফ্যাক্টরিং চিটশিটটি একবার দেখুন


7

আমি এটিকে "ম্যাজিক নম্বরের" একটি নম্বর বলব - এমন নম্বরগুলি যা বিশেষ এবং তাদের নিজস্ব কোনও স্পষ্ট অর্থ নেই।

আমি এখানে যে রিফ্যাক্টরিংটি প্রয়োগ করব তা হ'ল এনুমে রিটার্ন টাইপটিকে পুনর্গঠন করা, যেহেতু এটি ডোমেনের উদ্বেগকে কোনও প্রকারে আবদ্ধ করে। এটি থেকে সঙ্কলিত ত্রুটিগুলি নিয়ে কাজ করা সম্ভব টুকরোচির হওয়া উচিত, যেহেতু জাভা এনামগুলিকে অর্ডার এবং সংখ্যা দেওয়া যেতে পারে। তা না হলেও, কালি ফিরে আসার পরিবর্তে সরাসরি তাদের সাথে মোকাবেলা করা কঠিন হবে না।


এটি সাধারণত 'ম্যাজিক সংখ্যা' দ্বারা বোঝানো হয় না।
ডি Drmmr

2
এটি কল সাইটগুলিতে যাদু নম্বর হিসাবে প্রদর্শিত হবেif (processLogin(..) == 3)
দাইনেথ

@ ডিডিআরএমএমআর - 'ম্যাজিক নম্বর' কোডের গন্ধ দ্বারা এটি বোঝানো হয়েছে। এই ফাংশন স্বাক্ষরটি প্রায় অবশ্যই বোঝায় যে প্রসেসলোগিন () "রিটার্ন 8" এর মতো লাইন ধারণ করে; এর বাস্তবায়নে, এবং এটি প্রসেসলোগিন () ব্যবহার করে কোডটিকে এই জাতীয় "যদি (ফলাফলফ্রমেপ্রসেসলোগিন == 7))" দেখতে কিছুটা দেখতে বাধ্য করে। "।"
স্টিফেন সি স্টিল

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

2

এটি কোডের একটি বিশেষত অপ্রীতিকর বিট। অ্যান্টিপ্যাটার্নটি "ম্যাজিক রিটার্ন কোডগুলি" নামে পরিচিত। আপনি এখানে একটি আলোচনা খুঁজে পেতে পারেন ।

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

আর একটি পদ্ধতি হ'ল ডিজাইনের রিফ্যাক্টর যাতে আপনি কোনও "ব্যবহারকারী" অবজেক্টকে একটি সফল লগইনের জন্য "প্রোফাইল" এবং "সেশন" অ্যাট্রিবিউটের সাথে ফিরিয়ে দেন, প্রয়োজনে একটি "অবশ্যই_চেঞ্জ_পাসওয়ার্ড" অ্যাট্রিবিউট এবং লগটি কেন নির্দেশ করতে বিশিষ্টতার একটি গোছা? - প্রবাহ যদি ব্যর্থ হয়।

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