আমি কি বড় ফাংশনগুলিকে রিফ্যাক্টর করব যাতে বেশিরভাগই একটি রেজেক্স থাকে? [বন্ধ]


15

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

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


3
আমি মনে করি না সেখানে আপনার ফাংশন কোন অন্যায় যে, বিবেচনা করা এটি একটি বড় অংশ হয় না ডকুমেন্টেশন । তবে প্রথমে প্রথমে একটি বড় নিয়মিত এক্সপ্রেশন ব্যবহার করে রক্ষণাবেক্ষণের সমস্যা থাকতে পারে।
জোয়েল করনেট

2
আপনি কি নিশ্চিত যে কোনও দৈত্য রেজেক্সই আপনার সমস্যার সেরা সমাধান? আপনি কি পার্সার লাইব্রেরির মতো সহজ বিকল্পগুলি বিবেচনা করেছেন বা মানক (এক্সএমএল, জেএসএন ইত্যাদি) এর সাথে একটি কাস্টম ফাইল ফর্ম্যাট প্রতিস্থাপন করেছেন?
লোরটাব্যাক

2
এই রেজেক্সের পরিবর্তিত / বর্ধিত / সরলিকৃত সংস্করণটি ব্যবহার করে কি অন্যান্য ফাংশন রয়েছে? এটি একটি গুরুত্বপূর্ণ সূচক হবে যে রিফ্যাক্টরিং হওয়া উচিত। যদি তা না হয়, আমি এটি যেমন ছিল তেমনি রেখে দেব। এর মতো জটিল স্ট্রিং ম্যানিপুলেশনের প্রয়োজন হ'ল এটি একটি নিজস্ব হলুদ পতাকা I এটি;)
কনরাড মোরাওস্কি

8
100 লাইনের রেজিপ এক্স কীভাবে কেবল 1 টি জিনিস করতে পারে?
পিটার বি

@ লরতাব্যাক: ইনপুটটি ব্যবহারকারী উত্পন্ন পাঠ (গদ্য)
ডুডঅনরক '

উত্তর:


36

আপনি যে মুখোমুখি হচ্ছেন তা হ'ল যুক্তিযুক্ত সিদ্ধান্ত গ্রহণের কারণে "সেরা অভ্যাস" এর আওতায় নির্দেশিকাগুলির নীতি অনুসরণের পক্ষপাতী লোকদের শ্রবণ থেকে comes

আপনি পরিষ্কারভাবে আপনার হোম ওয়ার্ক শেষ করেছেন:

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

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

দ্বিতীয় ভোটটি আপনার বিকল্পগুলি এবং প্রত্যেকটি থেকে আপনি কী পান (এবং হারাবেন) তা দেখে আসে:

  • Refactor। এটি কোনও ফাংশন কত দীর্ঘ হওয়া উচিত তার কারও ধারণার সাথে সম্মতি অর্জন করে এবং পাঠযোগ্যতার ত্যাগ দেয়।
  • কিছু করনা. এটি বিদ্যমান পাঠযোগ্যতা বজায় রাখে এবং কোনও ফাংশন কত দীর্ঘ হওয়া উচিত তার ধারণার সাথে সম্মতি ত্যাগ করে sacrifices

এই সিদ্ধান্ত নেমে আসে যার দিকে আপনি বেশি মূল্য দেন: পাঠযোগ্যতা বা দৈর্ঘ্য। আমি শিবির যে বিশ্বাস দৈর্ঘ্য হল পড়া চমৎকার কিন্তু পাঠযোগ্যতা হয় গুরুত্বপূর্ণ এবং কোন দিন সপ্তাহে সাবেক উপর আধুনিক নিতে হবে।

নীচের লাইন: এটি ভাঙা না থাকলে, এটি ঠিক করবেন না।


10
"এটি ভাঙা না থাকলে, এটি ঠিক করবেন না" এর জন্য +1।
জর্জিও

প্রকৃতপক্ষে. স্যান্ডি মেটজ বিধিগুলি ( gist.github.com/henrik/4509394 ) সুন্দর এবং সব কিছু, তবে youtube.com/watch?v=VO-NvnZfMA4#t=1379 এ সে কীভাবে এসেছিল এবং কেন লোকেরা গ্রহণ করছে সে সম্পর্কে সে আলোচনা করে তাদের পথ খুব গুরুত্বের সাথে।
আমদান

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

19

সত্যিই, আপনার ফাংশন "একটি কাজ করতে পারে" তবে আপনি নিজেরাই বলেছিলেন

আমি একাধিক ফাংশনে রেজেক্সকে ভেঙে ফেলা শুরু করতে পারি,

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

তবে আমি মনে করি যেন আমি সেইভাবে পাঠযোগ্যতা হারাব, যেহেতু আমি কার্যকরভাবে ভাষা পরিবর্তন করতে চলেছি

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

  • আপনার কোডটি যেভাবে আপনি কীভাবে পাঠযোগ্যতা সম্পর্কে ভাবেন তা নিশ্চিত করার জন্য আপনার কোডটি অন্য একজন উন্নত বিকাশকারীকে (সম্ভবত /codereview// এ ) দেখান। এই ধারণাটির জন্য খোলা থাকুন যে অন্যেরা আপনার মতো পঠনযোগ্য 100 লাইনের রেগ এক্সপ্রেস নাও পেতে পারে। কখনও কখনও "এটি ছোট ছোট টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টানা দ্বিতীয় চোখের মাধ্যমে কাটিয়ে উঠতে পারে।

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

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


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

4

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

দৈর্ঘ্যটি একটি আকারের "স্ট্যান্ডার্ড" যখন কোড আকারে আসে। যেখানে সি # তে একটি 100 লাইন ফাংশন দীর্ঘস্থায়ী হিসাবে বিবেচিত হতে পারে, এটি সমাবেশের কয়েকটি সংস্করণে ক্ষুদ্র হবে। আমি এমন কিছু এসকিউএল কোয়েরি দেখেছি যা ২০০ লাইনের কোড রেঞ্জের মধ্যে ছিল যা একটি প্রতিবেদনের জন্য খুব জটিল একটি ডেটা সেট করেছিল।

পুরোপুরি কার্যকরী কোড , এটি যতটা সহজ আপনি এটি যুক্তিসঙ্গতভাবে লক্ষ্যটিকে তৈরি করতে পারবেন ।

কেবল এটি দীর্ঘ হওয়ার কারণে এটি পরিবর্তন করবেন না।


3

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

my $start_re = qr/(?:\w+\.\w+)/;
my $middle_re = qr/(?:DOG)|(?:CAT)/;
my $end_re = qr/ => \d+/;

my $final_re = $start_re . $middle_re . $end_re;
# or: 
# my $final_re = qr/${start_re}${middle_re}${end_re}/

আমি ভার্বোজ পতাকাটি ব্যবহার করি, যা আপনি প্রস্তাব দিচ্ছেন তার থেকেও বেশি সুবিধাজনক।
ডুডঅনরক

1

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

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

এছাড়াও আমি প্রতিটি মূল অংশটি কয়েকটি ছোট এবং আরও নির্দিষ্ট ফাংশনগুলিতে বিভক্ত করতে পারি তাই শেষ পর্যন্ত আমার কাছে 5 টি আলাদা ফাংশন ছিল পুরো জিনিসটি করার জন্য এবং আমি কিছু ফাংশনকে বিভিন্ন জায়গায় পুনরায় ব্যবহার করতে পারি।


1

আপনি যে বিষয়টিকে বিবেচনা করতে পারেন বা নাও বিবেচনা করতে পারেন তা হ'ল সেই ভাষায় একটি রেজেক্স ব্যবহার না করে আপনি যে ভাষাটি ব্যবহার করছেন তাতে একটি ছোট পার্সার লিখুন। এটি পড়া, পরীক্ষা করা এবং বজায় রাখা আরও সহজ হতে পারে।


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

1
যদি কোনও রেজেক্স এটিকে বিশ্লেষণ করতে পারে তবে আপনি এটি বিশ্লেষণ করতে পারেন। আপনার প্রতিক্রিয়াটি আমার কাছে মনে হয়েছে যে আপনি পার্সিংয়ে পারদর্শী নন। যদি এমনটি হয় তবে আপনি রেজেক্সের সাথে লেগে থাকতে পারেন। হয় বা নতুন দক্ষতা শিখুন।
টমাস এডিং

আমি একটি নতুন দক্ষতা শিখতে চাই। কোনও ভাল সংস্থান আপনি প্রস্তাব করতে পারেন? আমি এর পিছনে তত্ত্ব আগ্রহী।
DudeOnRock

1

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

যাইহোক, ধরে নেওয়া যাক আপনি একটি রেজেক্স ভিত্তিক সমাধান স্থির রাখতে চান।

যেহেতু আমি আসল কোডটি জানি না, তাই আমি দুটি সম্ভাব্য পরিস্থিতি পরীক্ষা করব:

  • রেজেক্স সহজ (প্রচুর আক্ষরিক মিল এবং কয়েকটি বিকল্প)

    এক্ষেত্রে একক রেজেক্সের দেওয়া উন্নত বৈশিষ্ট্যগুলি অনিবার্য নয়। এর অর্থ এটি সম্ভবত বিভক্ত হয়ে আপনি উপকৃত হবেন।

  • রেজেক্স জটিল (প্রচুর বিকল্প)

    এক্ষেত্রে আপনি বাস্তবে পুরো পরীক্ষার কভারেজ রাখতে পারবেন না, কারণ আপনার সম্ভবত লক্ষ লক্ষ সম্ভাব্য প্রবাহ রয়েছে। সুতরাং, এটি পরীক্ষা করার জন্য, আপনাকে এটি বিভাজন করা দরকার।

আমার কল্পনার ঘাটতি থাকতে পারে, তবে আমি এমন কোন বাস্তব-বিশ্বের পরিস্থিতি সম্পর্কে ভাবতে পারি না যেখানে 100-লাইন রেজেক্স একটি ভাল সমাধান।

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