কার্যক্ষম শৈলী কীভাবে উপহাস নির্ভরতাগুলির সাথে সহায়তা করে?


10

সাম্প্রতিক জাভা ম্যাগাজিন ইস্যুতে কেন্ট বেকের সাথে সাক্ষাত্কার থেকে:

বিনস্টক: আসুন মাইক্রোসার্ভেসিস নিয়ে আলোচনা করা যাক। আমার কাছে মনে হয় যে মাইক্রোসার্ভেসিসে প্রথম-পরীক্ষাটি এই অর্থে জটিল হয়ে উঠবে যে কিছু পরিষেবা, কার্য সম্পাদনের জন্য, অন্যান্য পরিষেবাদির পুরো গুচ্ছের উপস্থিতি প্রয়োজন। তুমি কি একমত?

বেক: একটি বড় শ্রেণি বা প্রচুর ছোট্ট ক্লাস করার বিষয়ে এটি একই সেট ট্রেড অফসের মতো বলে মনে হচ্ছে।

বিনস্টক: ঠিক, আমার ধারণা ব্যতীত, এখানে আপনাকে একটি সিস্টেম সেট আপ করতে সক্ষম হওয়ার জন্য আপনাকে প্রচুর পরিমাণে বিদ্রূপ ব্যবহার করতে হবে যার মাধ্যমে আপনি কোনও প্রদত্ত পরিষেবা পরীক্ষা করতে পারবেন।

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

সে কি বোঝাচ্ছে? কীভাবে কার্যকরী শৈলী আপনাকে বাহ্যিক নির্ভরতার উপহাস থেকে মুক্তি দিতে পারে?



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

উত্তর:


8

একটি খাঁটি ফাংশন হ'ল:

  1. হবে সবসময় একই আর্গুমেন্ট দেওয়া একই ফলাফল দিতে
  2. কোন পর্যবেক্ষণযোগ্য পার্শ্ব প্রতিক্রিয়া নেই (যেমন রাষ্ট্র পরিবর্তন)

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

bool UserLogin(string username, string password)
{
    var user = _database.FindUser(username);
    if (user == null)
    {
        return false;
    }
    if (user.FailedAttempts > 3)
    {
        return false;
    }
    // Password hashing omitted for brevity
    if (user.Password != password)
    {
        _database.RecordFailedLoginAttempt(username);
    }
    return true;
}

এটি বেশ পরিষ্কার যে এটি কোনও খাঁটি কাজ নয়:

  1. এই ফাংশনটি সর্বদা প্রদত্ত usernameএবং passwordসংমিশ্রণের জন্য একই ফলাফল দেয় না কারণ ফলাফলটি ডাটাবেসে সঞ্চিত ব্যবহারকারীর রেকর্ডের উপর নির্ভর করে।
  2. ফাংশনটি ডাটাবেসের স্থিতি পরিবর্তন করতে পারে, এর পার্শ্ব প্রতিক্রিয়া রয়েছে।

এছাড়াও নোট করুন যে এই ফাংশনটি পরীক্ষা করার জন্য আমাদের দুটি ডাটাবেস কলকে মক আউট করতে হবে FindUserএবং RecordFailedLoginAttempt

যদি আমরা এই কোডটিকে আরও কার্যকরী শৈলীতে সংশোধন করতে পারি তবে আমরা এ জাতীয় কিছু দিয়ে শেষ করতে পারি:

bool UserLogin(string username, string password)
{
    var user = _database.FindUser(username);
    var result = UserLoginPure(user, password);
    if (result == Result.FailedAttempt)
    {
        _database.RecordFailedLoginAttempt(username);
    }
    return result == Result.Success;
}

Result UserLoginPure(User user, string pasword)
{
    if (user == null)
    {
        return Result.UserNotFound;
    }
    if (user.FailedAttempts > 3)
    {
        return Result.LoginAttemptsExceeded;
    }
    if (user.Password != password)
    {
        return Result.FailedAttempt;        
    }
    return Result.Success;
}

মনে রাখবেন যে UserLoginফাংশনটি এখনও নিখুঁত না হলেও, ফাংশনটি UserLoginPureএখন একটি খাঁটি ফাংশন এবং ফলস্বরূপ মূল ব্যবহারকারীর প্রমাণীকরণের যুক্তি কোনও বাহ্যিক নির্ভরতার উপহাস না করে ইউনিট পরীক্ষা করা যেতে পারে। এটি কারণ হ'ল ডেটাবেসটির সাথে মিথস্ক্রিয়াটি কল স্ট্যাককে উচ্চতরভাবে পরিচালনা করা হয়।


আপনার ব্যাখ্যাটি কি: অপরিহার্য শৈলী = স্টেটফুল মাইক্রোসার্ভেসেস এবং ফাংশনাল স্টাইল = স্টেটলেস মাইক্রোসার্জিজ ?
k3b 15

@ k3b বাছাই করুন, মাইক্রো পরিষেবাগুলি সম্পর্কে বিট ব্যতীত। কার্যকরী শৈলী রাষ্ট্রের কারচুপি ছাড়াই খাঁটি ফাংশন ব্যবহার করে তবে খুব সহজভাবে আবশ্যক স্টাইলটি রাষ্ট্রের হেরফেরের সাথে জড়িত।
জাস্টিন

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

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

আমার আগের মন্তব্যের শেষ অংশের জন্য সংশোধন: "এবং একটি খাঁটি ফাংশন প্যারামিটার হিসাবে প্রদত্ত ব্যবহারকারীর উপর পার্শ্ব প্রতিক্রিয়া প্ররোচিত করে না " "
রাইজিং ডার্কনেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.