আমি কীভাবে জানতে পারি যে আমার পদ্ধতিগুলি পুনরায় ব্যবহারযোগ্য হওয়া উচিত? [বন্ধ]


133

আমি বাড়িতে আমার নিজের ব্যবসায় মনে করছি এবং আমার স্ত্রী আমার কাছে এসে বলেন says

মধু .. আপনি কি কনসোলে 2018 সালের জন্য সারা বিশ্ব জুড়ে সমস্ত দিনের আলো সঞ্চয় মুদ্রণ করতে পারেন? আমার কিছু পরীক্ষা করা দরকার

এবং আমি অত্যন্ত খুশী কারণ আমার জাভা অভিজ্ঞতা নিয়ে আমি আমার সারা জীবনের জন্য অপেক্ষা করেছিলাম এবং এটি নিয়ে এসেছি:

import java.time.*;
import java.util.Set;

class App {
    void dayLightSavings() {
        final Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
        availableZoneIds.forEach(
            zoneId -> {
                LocalDateTime dateTime = LocalDateTime.of(
                    LocalDate.of(2018, 1, 1), 
                    LocalTime.of(0, 0, 0)
                );
                ZonedDateTime now = ZonedDateTime.of(dateTime, ZoneId.of(zoneId));
                while (2018 == now.getYear()) {
                    int hour = now.getHour();
                    now = now.plusHours(1);
                    if (now.getHour() == hour) {
                        System.out.println(now);
                    }
                }
            }
        );
    }
}

তবে তারপরে তিনি বলেছিলেন যে তিনি কেবলমাত্র আমি নৈতিক প্রশিক্ষিত সফ্টওয়্যার ইঞ্জিনিয়ার ছিল কিনা তা পরীক্ষা করে দেখছিলাম এবং আমাকে বলেছিল যে দেখে মনে হচ্ছে আমি যেহেতু নেই ( এখান থেকে নেওয়া ) ..

এটি লক্ষ করা উচিত যে কোনও নৈতিক প্রশিক্ষিত সফ্টওয়্যার ইঞ্জিনিয়ার কখনও ডাস্ট্রোব্যাগদাদ পদ্ধতি লিখতে সম্মত হন না। বেসিক পেশাদার নীতিশাস্ত্রের পরিবর্তে তার একটি ডিস্ট্রোয়সিটি পদ্ধতি লিখতে হবে, যাতে বাগদাদকে প্যারামিটার হিসাবে দেওয়া যেতে পারে।

এবং আমি যেমন আছি, ঠিক আছে, ঠিক আছে, আপনি আমাকে পেয়েছেন .. যে কোনও বছর আপনি পছন্দ করেন, এখানে যান:

import java.time.*;
import java.util.Set;

class App {
    void dayLightSavings(int year) {
        final Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
        availableZoneIds.forEach(
            zoneId -> {
                LocalDateTime dateTime = LocalDateTime.of(
                    LocalDate.of(year, 1, 1), 
                    LocalTime.of(0, 0, 0)
                );
                ZonedDateTime now = ZonedDateTime.of(dateTime, ZoneId.of(zoneId));
                while (year == now.getYear()) {
                    // rest is same..

তবে আমি কীভাবে জানব যে কীভাবে (এবং কী) প্যারামিটারাইজ করতে হবে? সর্বোপরি, সে বলতে পারে ..

  • তিনি একটি কাস্টম স্ট্রিং ফর্ম্যাটারটি পাস করতে চান, সম্ভবত আমি যে ফর্ম্যাটটি ইতিমধ্যে মুদ্রণ করছি তা সে পছন্দ করে না: 2018-10-28T02:00+01:00[Arctic/Longyearbyen]

void dayLightSavings(int year, DateTimeFormatter dtf)

  • তিনি কেবল নির্দিষ্ট মাসের জন্য আগ্রহী

void dayLightSavings(int year, DateTimeFormatter dtf, int monthStart, int monthEnd)

  • তিনি নির্দিষ্ট ঘন্টা সময় আগ্রহী

void dayLightSavings(int year, DateTimeFormatter dtf, int monthStart, int monthEnd, int hourStart, int hourend)

আপনি যদি কোনও নলক প্রশ্ন খুঁজছেন:

তাহলে destroyCity(City city)বেশী ভালো destroyBaghdad()হয় takeActionOnCity(Action action, City city)আরও ভাল? কেন কেন না?

সর্বোপরি, আমি প্রথমে Action.DESTROYতখন সাথে কল করতে পারি Action.REBUILD, তাই না?

তবে শহরে পদক্ষেপ নেওয়া আমার পক্ষে যথেষ্ট নয়, কীভাবে takeActionOnGeographicArea(Action action, GeographicalArea GeographicalArea)? সর্বোপরি, আমি কল করতে চাই না:

takeActionOnCity(Action.DESTORY, City.BAGHDAD);

তারপর

takeActionOnCity(Action.DESTORY, City.ERBIL);

এবং তাই যখন আমি করতে পারি:

takeActionOnGeographicArea(Action.DESTORY, Country.IRAQ);

PS আমি আমার উল্লেখ করা উক্তিটিকে ঘিরে আমার প্রশ্নটি তৈরি করেছি, আমার কোনও দেশ, ধর্ম, জাতি বা বিশ্বের যে কোনও কিছুই নেই। আমি শুধু একটি বিষয় বলার চেষ্টা করছি।



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

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

7
আপনার স্ত্রী মিথ্যা কথা বলে আপনার সময় নষ্ট করার জন্য অনৈতিক। তিনি একটি উত্তর চেয়েছিলেন, এবং একটি প্রস্তাবিত মাধ্যম দিয়েছেন; সেই চুক্তি অনুসারে আপনি কীভাবে এই আউটপুটটি পাবেন তা কেবল আপনার এবং নিজের মধ্যে। এছাড়াও, destroyCity(target)উপায় কি আরও বেশি অনৈতিক destroyBagdad()! কোন ধরণের দানব কোনও শহরকে নিশ্চিহ্ন করার জন্য একটি প্রোগ্রাম লিখেছেন, পৃথিবীর কোনও শহর ছেড়ে দিন? যদি সিস্টেমটি আপোস করা হত ?! এছাড়াও, সময় / সংস্থান ব্যবস্থাপনার (বিনিয়োগের প্রচেষ্টা) নীতিশাস্ত্রের সাথে কী সম্পর্ক রয়েছে? যতক্ষণ পর্যন্ত মৌখিক / লিখিত চুক্তিটি সম্মতি অনুসারে সম্পন্ন হয়েছিল।
তেজরা

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

উত্তর:


114

এটি সমস্ত ভাবে কচ্ছপ।

বা এই ক্ষেত্রে বিমূর্ততা।

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

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

কোন বৈশিষ্ট্য প্রয়োগ করতে হবে তা আমি কীভাবে জানব?

আমি উপরে বর্ণনার কারণ হ'ল আপনি ইতিমধ্যে এই ফাঁদে পড়েছেন:

তবে আমি কীভাবে বুঝতে পারি যে কতগুলি (এবং কী) প্যারামিটারাইজ করতে হবে? সর্বোপরি, সে বলতে পারে

"তিনি বলতে পারেন" বর্তমান ব্যবসায়ের প্রয়োজনীয়তা নয়। এটি ভবিষ্যতের ব্যবসায়ের প্রয়োজনীয়তার অনুমান। একটি সাধারণ নিয়ম হিসাবে, অনুমানের উপর নিজেকে ভিত্তি করবেন না, কেবল বর্তমানে যা প্রয়োজন তা কেবল বিকাশ করুন।

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

আমি কীভাবে জানি যে কোন স্থাপত্যটি প্রয়োগ করা উচিত?

এটি কৃপণ। গ্রাহক অভ্যন্তরীণ কোড সম্পর্কে চিন্তা করেন না, তাই তাদের এটির প্রয়োজন হলে আপনি তাদের জিজ্ঞাসা করতে পারবেন না। বিষয়টি সম্পর্কে তাদের মতামত বেশিরভাগ অপ্রাসঙ্গিক।

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

আমার কোডটি আরও বিমূর্ত করার জন্য আমি কীভাবে জানতে পারি?

আমি কোথায় এটি পড়েছি তা আমি জানি না (যদি কেউ জানে তবে আমাকে জানান এবং আমি কৃতিত্ব দেব), তবে থাম্বের একটি ভাল নিয়ম হ'ল বিকাশকারীদের একটি গুহাচরণের মতো গণনা করা উচিত: এক, দু'জন

এখানে চিত্র বর্ণনা লিখুন এক্সকেসিডি # 764

অন্য কথায়, যখন একটি নির্দিষ্ট অ্যালগরিদম / প্যাটার্ন একটি জন্য ব্যবহৃত হচ্ছে তৃতীয় সময়, এটা আনমনা হবে যাতে এটি পুনর্ব্যবহারযোগ্য (= উপভোগ্য অনেক বার)।

কেবল পরিষ্কারভাবেই, আমি বোঝাচ্ছি না যে যখন অ্যালগরিদমের মাত্র দুটি উদাহরণ ব্যবহৃত হচ্ছে তখন আপনি পুনরায় ব্যবহারযোগ্য কোডটি লিখবেন না। অবশ্যই আপনি এটি বিমূর্ত করতে পারেন, তবে নিয়মটি হ'ল তিনটি ক্ষেত্রে আপনাকে বিমূর্ত করতে হবে

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

তাহলে destroyCity(City city)বেশী ভালো destroyBaghdad()হয় takeActionOnCity(Action action, City city)আরও ভাল? কেন কেন না?

এটি একাধিক বিষয়ের উপর নির্ভর করে:

  • কোনও শহরে কি একাধিক পদক্ষেপ নেওয়া যেতে পারে ?
  • এই ক্রিয়াগুলি কি বিনিময়যোগ্যভাবে ব্যবহার করা যেতে পারে? কারণ যদি "ধ্বংস" এবং "পুনর্নির্মাণ" ক্রিয়াকলাপগুলিতে সম্পূর্ণ আলাদা মৃত্যুদণ্ড কার্যকর হয়, তবে দুটিকে একটি takeActionOnCityপদ্ধতিতে মার্জ করার কোনও মানে নেই ।

এছাড়াও সচেতন থাকুন যে আপনি যদি এটিকে পুনরাবৃত্তভাবে বিমূর্ত করেন, আপনি এমন একটি পদ্ধতির সাথে শেষ করতে যাচ্ছেন যা এতটাই বিমূর্ত যে এটি অন্য পদ্ধতি চালানোর জন্য ধারক ছাড়া আর কিছুই নয়, যার অর্থ আপনি নিজের পদ্ধতিটিকে অপ্রাসঙ্গিক এবং অর্থহীন করে তুলেছেন।
যদি আপনার সম্পূর্ণ takeActionOnCity(Action action, City city)পদ্ধতির শরীরটি এর চেয়ে বেশি action.TakeOn(city);কিছু না হয়ে থাকে তবে আপনার অবাক হওয়া উচিত যে takeActionOnCityপদ্ধতির সত্যিকার অর্থেই কোনও উদ্দেশ্য রয়েছে বা এটি কোনও অতিরিক্ত স্তর নয় যা মানটির কিছুই যোগ করে না।

তবে শহরে পদক্ষেপ নেওয়া আমার পক্ষে যথেষ্ট নয়, কীভাবে takeActionOnGeographicArea(Action action, GeographicalArea GeographicalArea)?

একই প্রশ্ন এখানে পপ আপ:

  • আপনার কি ভৌগলিক অঞ্চলে ব্যবহারের কেস আছে?
  • একটি শহর এবং একটি অঞ্চলে একটি ক্রিয়া কার্যকর করা কি একই রকম?
  • কোন অঞ্চল / শহরে কি কোনও পদক্ষেপ নেওয়া যেতে পারে?

যদি আপনি তিনটিইকে অবশ্যই "হ্যাঁ" এর উত্তর দিতে পারেন তবে একটি বিমূর্তিটি মঞ্জুরিপ্রাপ্ত।


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

2
> "আমি জানি না আমি কোথায় এটি পড়েছি [..]"। আপনি হয়ত কোডিং হরর: তিনজনের নিয়ম পড়ছেন ।
রুন

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

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

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

44

অনুশীলন করা

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

যদিও এটি এখন খুব সহায়ক নয় , তবে কিছু গাইডলাইন কীভাবে হবে?

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

গাইডলাইন 1: আপনার দরকার নেই

সিরিয়াসলি। থাম. প্রায়শই এটির চেয়ে বেশি, কল্পনা করা ভবিষ্যতের সমস্যাটি প্রদর্শিত হয় না - এবং আপনি এটি যেমন কল্পনা করেছিলেন ঠিক তেমনটি দেখাবে না।

গাইডলাইন 2: ব্যয় / সুবিধা

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

গাইডলাইন 3: ধ্রুবকগুলিতে ফোকাস করুন

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


1
এটি কেবল একটি গাইডলাইন, 1 টি ঠিক আছে তবে আপনি তাদের তাকান এবং যান "এই কি কখনও পরিবর্তিত হবে?" নাহ। এবং মুদ্রণটি উচ্চতর ক্রমের সাথে প্যারামিটারাইজড হতে পারে - যদিও জাভা সেগুলিতে দুর্দান্ত নয়।
টেলাস্টিন

5
@ কোরেতুগায়: যদি প্রোগ্রামটি আপনার স্ত্রী বাড়িতে আসার জন্য সত্যিই হয়ে থাকে তবে YAGNI আপনাকে জানায় যে আপনার প্রাথমিক সংস্করণটি নিখুঁত, এবং আপনার ধ্রুবক বা পরামিতিগুলি প্রবর্তনের জন্য আর কোনও সময় বিনিয়োগ করা উচিত নয়। ইয়াগনির প্রসঙ্গের প্রয়োজন - আপনার প্রোগ্রামটি কি কোনও থ্রো- অ্যাওল সলিউশন, বা কোনও মাইগ্রেশন প্রোগ্রাম কেবল কয়েক মাসের জন্য চালিত হয়, বা এটি বেশ কয়েক দশক ধরে ব্যবহৃত এবং রক্ষণাবেক্ষণের উদ্দেশ্যে তৈরি একটি বিশাল ইআরপি সিস্টেমের অংশ?
ডক ব্রাউন

8
@ কোরেতুগায়: গণনা থেকে আই / ওকে আলাদা করা একটি মৌলিক প্রোগ্রাম কাঠামোগত কৌশল। ডেটা উপস্থাপনা থেকে ডেটা ব্যবহার থেকে ডেটা পরিবর্তন থেকে ডেটা ফিল্টারিং থেকে ডেটা ফিল্টারিং থেকে ডেটা আলাদা করা। আপনার কিছু কার্যকরী প্রোগ্রাম অধ্যয়ন করা উচিত, তবে আপনি এটি আরও স্পষ্ট দেখতে পাবেন। ফাংশনাল প্রোগ্রামিংয়ে, অসীম পরিমাণে ডেটা উত্পন্ন করা, আপনার আগ্রহী কেবলমাত্র ডেটা ফিল্টার করে, আপনার প্রয়োজনীয় ফর্ম্যাটে ডেটা রূপান্তর করা, এর থেকে একটি স্ট্রিং তৈরি করতে এবং 5 টি বিভিন্ন কার্যক্রমে এই স্ট্রিংটি মুদ্রণ করা বেশ সাধারণ বিষয়, প্রতিটি পদক্ষেপের জন্য একটি।
Jörg W Mittag

3
সাইডেনোট হিসাবে, দৃAG়তার সাথে YAGNI অনুসরণ করে ক্রমাগত রিফেক্টরটির প্রয়োজন হয়: "অবিচ্ছিন্ন রিফ্যাক্টরিং ব্যতীত এটি বিশৃঙ্খলাবদ্ধ কোড এবং বিশাল পুনর্নির্মাণের কারণ হতে পারে, যা প্রযুক্তিগত debtণ হিসাবে পরিচিত known" সুতরাং যদিও ইয়াজিএনআই সাধারণভাবে একটি ভাল জিনিস, এটি কোড পুনর্বিবেচনা এবং পুনঃমূল্যায়ন করার একটি দুর্দান্ত দায়িত্ব নিয়ে আসে, যা প্রতিটি বিকাশকারী / সংস্থাই করতে ইচ্ছুক এমন কিছু নয়।
ফ্ল্যাটার

4
@ টেলাস্টিন: আমি এই প্রশ্নটি প্রসারিত করার পরামর্শ দিচ্ছি যে "এটি কি কখনও বদলাবে না এবং ধ্রুবকের নাম না দিয়ে কোডের তুচ্ছভাবে পাঠযোগ্য ?" এমনকি যে মানগুলি কখনও পরিবর্তন হয় না, কেবল সেগুলি কেবল পাঠযোগ্য রাখার জন্য তাদের নামকরণের ক্ষেত্রে এটি প্রাসঙ্গিক হতে পারে।
তোলা

27

প্রথমত: কোনও সুরক্ষার বিবেচ্য সফ্টওয়্যার বিকাশকারী কোনও কারণে কোনও অনুমোদন টোকেন পাস না করে একটি ডস্ট্রোসিটি পদ্ধতি লিখবেন না।

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

দ্বিতীয়ত: মৃত্যুদন্ড কার্যকর করার সময় সমস্ত কোড অবশ্যই সম্পূর্ণ নির্দিষ্ট করতে হবে

সিদ্ধান্তটি কঠোরভাবে কোড করা হয়েছে বা অন্য স্তরে স্থগিত হয়েছিল তা বিবেচ্য নয়। এক পর্যায়ে কিছু ভাষায় একটি কোডের টুকরো রয়েছে যা কী ধ্বংস করতে হবে এবং কীভাবে এটি নির্দেশ দেবে উভয়ই জানে।

এটি একই অবজেক্ট ফাইলে destroyCity(xyz)থাকতে পারে এবং এটি কোনও কনফিগারেশন ফাইলেও destroy {"city": "XYZ"}"থাকতে পারে : বা এটি কোনও ইউআইতে ক্লিক এবং কী-পিসের একটি সিরিজ হতে পারে।

তৃতীয়ত:

মধু .. আপনি কি কনসোলে 2018 সালের জন্য সারা বিশ্ব জুড়ে সমস্ত দিনের আলো সঞ্চয় মুদ্রণ করতে পারেন? আমার কিছু পরীক্ষা করা দরকার

প্রয়োজনীয়তার একটি খুব আলাদা সেট:

তিনি একটি কাস্টম স্ট্রিং বিন্যাস পাস করতে চান ..., কেবলমাত্র নির্দিষ্ট মাসের সময়কালে আগ্রহী, ... [এবং] নির্দিষ্ট সময়ের জন্য আগ্রহী ...

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

সাধারণত যে সকল লোকের সফ্টওয়্যার প্রয়োজন তাদের বক্তব্য সাধারণ কিছু চায় না; তারা নির্দিষ্ট কিছু চায় আরও বিকল্প দিয়ে আপনি বাস্তবে তাদের জীবনকে আরও জটিল করে তুলছেন। যদি তারা এই জটিলতাটি চায়, তবে তারা আপনাকে জিজ্ঞাসা না করে পরিবর্তে একটি সংকলক ব্যবহার করবে।

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

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

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

শুরুতে প্রদত্ত পরামর্শটি বোঝায় যে আপনার ফাংশনটি করার কোনও অধিকার নেই এমন সিদ্ধান্তকে যুক্তি হিসাবে পাস করা উচিত। সমস্যাটি হ'ল কোনও DestroyBaghdadফাংশন আসলে সেই ফাংশন হতে পারে যা তার অধিকার পায়।


সংকলক সম্পর্কে অংশ +1 পছন্দ!
লি

4

এখানে প্রচুর দীর্ঘ বাঁকানো উত্তর রয়েছে, তবে সত্যই আমি মনে করি এটি অত্যন্ত সহজ

আপনার ফাংশনে যে কোনও হার্ড কোডেড তথ্য যা ফাংশন নামের অংশ নয় এটি একটি প্যারামিটার হওয়া উচিত।

সুতরাং আপনার ফাংশন

class App {
    void dayLightSavings() {
        final Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
        availableZoneIds.forEach(zoneId -> {
            LocalDateTime dateTime = LocalDateTime.of(LocalDate.of(2018, 1, 1), LocalTime.of(0, 0, 0));
            ZonedDateTime now = ZonedDateTime.of(dateTime, ZoneId.of(zoneId));
            while (2018 == now.getYear()) {
                int hour = now.getHour();
                now = now.plusHours(1);
                if (now.getHour() == hour) {
                    System.out.println(now);
                }
            }
        });
    }
}

তোমার আছে:

The zoneIds
2018, 1, 1
System.out

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

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


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

প্রয়োজনীয়তা কনসোল মুদ্রণ করা হয়। আমার পরামর্শ অনুসারে আউটপুট স্ট্রিমে প্যারামিটার হিসাবে পাস করে আপনি টান কাপলংকে প্রশমিত করতে পারেন
Ewan

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

একটি আউটপুট স্ট্রিম গ্রাহক
ইওয়ান

না, একটি OutputStream একটি নয় কনজিউমার
ডেভিড কনরাড

4

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

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


পদার্থ, পদ্ধতি নয়

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

interface Destroyable {
    void destroy();
}

তারপরে আপনার একটি শহর রয়েছে যা এই ইন্টারফেসটি প্রয়োগ করে:

class City implements Destroyable {
    @Override
    public void destroy() {
        ...code that destroys the city
    }
}

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

প্রতিনিধি, "নিয়ন্ত্রণ" নয়

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

interface Part extends Destroyable {
    ...part-specific methods
}

class Building implements Part {
    ...part-specific methods
    @Override
    public void destroy() {
       ...code to destroy a building
    }
}

class Street implements Part {
    ...part-specific methods
    @Override
    public void destroy() {
        ...code to destroy a building
    }
}

class City implements Destroyable {
    public List<Part> parts() {...}

    @Override
    public void destroy() {
        parts().forEach(Destroyable::destroy);            
    }
}

আপনি যদি সত্যিই পাগল হয়ে যেতে চান এবং এমন কোনও ধারণাটি প্রয়োগ করতে চান যা কোনও কোনও Bombজায়গায় ফেলে দেওয়া হয় এবং একটি নির্দিষ্ট ব্যাসার্ধের মধ্যে সমস্ত কিছুকে ধ্বংস করে দেয় তবে এটি দেখতে এরকম কিছু হতে পারে:

class Bomb {
    private final Integer radius;

    public Bomb(final Integer radius) {
        this.radius = radius;
    }

    public void drop(final Grid grid, final Coordinate target) {
        new ObjectsByRadius(
            grid,
            target,
            this.radius
        ).forEach(Destroyable::destroy);
    }
}

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

মিথস্ক্রিয়া, অ্যালগরিদম নয়

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

আমি আপনাকে আপনার মূল উদাহরণটিতে কিছু উপহার দেব, তবে "মুদ্রণ ... দিবালোক সঞ্চয়" এর অর্থ কী তা আমি সত্যই বুঝতে পারি না। সমস্যাটির এই বিভাগ সম্পর্কে আমি যা বলতে পারি তা হ'ল যে সময় আপনি কোনও গণনা করছেন, ফলাফলটি বেশ কয়েকটি উপায়ে ফর্ম্যাট করা যেতে পারে, আমার এটি ভেঙে দেওয়ার জন্য আমার পছন্দের উপায়টি হ'ল:

interface Result {
    String print();
}

class Caclulation {
    private final Parameter paramater1;

    private final Parameter parameter2;

    public Calculation(final Parameter parameter1, final Parameter parameter2) {
        this.parameter1 = parameter1;
        this.parameter2 = parameter2;
    }

    public Result calculate() {
        ...calculate the result
    }
}

class FormattedResult {
    private final Result result;

    public FormattedResult(final Result result) {
        this.result = result;
    }

    @Override
    public String print() {
        ...interact with this.result to format it and return the formatted String
    }
}

যেহেতু আপনার উদাহরণটি জাভা লাইব্রেরির ক্লাসগুলি ব্যবহার করে যা এই নকশাটিকে সমর্থন করে না, আপনি কেবল ZonedDateTimeসরাসরি এর API ব্যবহার করতে পারেন । এখানে ধারণাটি হ'ল প্রতিটি গণনা তার নিজস্ব বস্তুর মধ্যে আবদ্ধ হয় ap এটি কতবার চালানো উচিত বা ফলাফলটি কীভাবে ফর্ম্যাট করা উচিত সে সম্পর্কে কোনও অনুমান করে না। এটি গণনার সহজতম রূপটি সম্পাদনের সাথে একচেটিয়াভাবে সম্পর্কিত। এটি উভয়ই বোঝা সহজ এবং পরিবর্তনের জন্য নমনীয় করে তোলে। তেমনি, Resultগণনাটির ফলাফলকে encapsulate করার সাথে একচেটিয়াভাবে উদ্বেগ প্রকাশিত হয় এবং আমরা যে বিধিগুলি সংজ্ঞায়িত করি তার অনুসারে এটি ফর্ম্যাট করার FormattedResultজন্য একচেটিয়াভাবে সম্পর্কিত is Resultএইভাবে,আমরা আমাদের প্রতিটি পদ্ধতির জন্য নিখুঁত সংখ্যক যুক্তি খুঁজে পেতে পারি যেহেতু তাদের প্রত্যেকের একটি সুস্পষ্ট নির্ধারিত টাস্ক রয়েছে । ইন্টারফেসগুলি পরিবর্তিত হয় না এমনভাবে দীর্ঘ অগ্রসর হওয়া সংশোধন করাও সহজ (আপনি যদি আপনার বস্তুর দায়বদ্ধতা যথাযথভাবে কমিয়ে দেন তবে তারা এগুলি করার মতো সম্ভাবনা নয়)। আমাদেরmain()পদ্ধতিটি দেখতে দেখতে এটির মতো হতে পারে:

class App {
    public static void main(String[] args) {
        final List<Set<Paramater>> parameters = ...instantiated from args
        parameters.forEach(set -> {
            System.out.println(
                new FormattedResult(
                    new Calculation(
                        set.get(0),
                        set.get(1)
                    ).calculate()
                ).print()
            );
        });
    }
}

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


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

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

@ ম্যাপেল_শ্যাফ্ট স্পষ্টতই, কেবল ওপিই দৃ the়সংকল্পবদ্ধ করতে পারে যদি আমার উত্তর তার প্রশ্নের সাথে প্রাসঙ্গিক হয় কারণ আমাদের বাকী ব্যক্তি তার উদ্দেশ্য সম্পর্কে আমাদের ব্যাখ্যার পক্ষে লড়াইয়ে লড়াই করতে পারে, সবই সমানভাবে ভুল হতে পারে।
স্টুপুরম্যান

@ ম্যাপেল_শ্যাফ্ট আমি প্রশ্নের সাথে এটি কীভাবে সম্পর্কিত তা স্পষ্ট করে বলার চেষ্টা করার জন্য একটি ভূমিকা যুক্ত করেছি এবং উত্তর এবং উদাহরণ প্রয়োগের মধ্যে একটি স্পষ্ট চিত্রায়ন প্রদান করেছি। এটা কি ভালো?
স্টুপুরম্যান

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

3

অভিজ্ঞতা , ডোমেন জ্ঞান এবং কোড পর্যালোচনা।

আর কত বা কিভাবে সামান্য নির্বিশেষে অভিজ্ঞতা , ডোমেইন জ্ঞান , অথবা দল আপনি, আপনার প্রয়োজন এড়াতে পারে না যেমন-প্রয়োজনীয় refactor।


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

(এই অভিজ্ঞতা স্বভাবগতভাবে আপনার কিছু ডোমেন অবজেক্ট এবং পদ্ধতিতেও স্থানান্তর করতে পারে))

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

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


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

  • ন্যূনতম প্যারামিট্রাইজেশন সহ নিষ্পাপ বাস্তবায়ন শুরু করুন।
    (আপনার ইতিমধ্যে জানা কোনও প্যারামিটার অন্তর্ভুক্ত করুন , অবশ্যই ...)
  • ম্যাজিক নম্বর এবং স্ট্রিংগুলি সরান, তাদের কনফিগার এবং / অথবা পরামিতিগুলিতে সরানো moving
  • ফ্যাক্টর "বৃহত্তর" পদ্ধতিগুলি ছোট, নামযুক্ত পদ্ধতিতে পরিণত হয়
  • রিফ্যাক্টর অত্যন্ত অপ্রয়োজনীয় পদ্ধতিগুলি (সুবিধাজনক হলে) একটি সাধারণ ডিনোমিনেটরে পরিণত হয়, পার্থক্যগুলিকে প্যারামিট্রাইজ করে।

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

তবে, কেবলমাত্র প্রচুর অভিজ্ঞতা এবং এর বাইরেও, আমি বেশ নমনীয় কোডটি DRY-ing এর পরামর্শ দিচ্ছি। সুস্পষ্ট লঙ্ঘনের পুনরুদ্ধার করা শক্ত নয়। এবং, যদি আপনি খুব উদ্যোগী হন তবে আপনি "ওভার-ডিআরওয়াই" কোড দিয়ে শেষ করতে পারেন যা "ডব্লিউইটি" সমতুল্যর চেয়ে পড়া, বুঝতে এবং বজায় রাখা আরও কঠিন er


2
তাহলে কোন সঠিক উত্তর নেই If destoryCity(City city) is better than destoryBaghdad(), is takeActionOnCity(Action action, City city) even better?? এটি হ্যাঁ / কোনও প্রশ্ন নয়, তবে এর কোনও উত্তর নেই, তাই না? বা প্রাথমিক অনুমানটি ভুল, destroyCity(City)অগত্যা আরও ভাল না হতে পারে এবং এটি আসলে নির্ভর করে ? সুতরাং এর অর্থ এই নয় যে আমি কোনও নৈতিক প্রশিক্ষিত সফটওয়্যার প্রকৌশলী নই কারণ আমি কোনও পরামিতি ছাড়াই সরাসরি প্রথম স্থান প্রয়োগ করেছি? মানে আমি যে কংক্রিটের প্রশ্নটি করছি তার উত্তর কী?
Koray Tugay

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

আমি বলতে চাই ... আসুন এমনকি destroyBaghdad()পদ্ধতি থেকে একটি পদক্ষেপ নেওয়া যাক । প্রসঙ্গটি কী? এটি কি এমন একটি ভিডিও গেম যেখানে গেমের পরিণতি বাগদাদে ধ্বংস হয়ে যায় ??? যদি তাই হয় ... destroyBaghdad()একটি নিখুঁত যুক্তিযুক্ত পদ্ধতির নাম / স্বাক্ষর হতে পারে ...
সুইডজেন

1
সুতরাং আপনি আমার প্রশ্নের উদ্ধৃত উক্তিটির সাথে একমত নন, তাই না? It should be noted that no ethically-trained software engineer would ever consent to write a DestroyBaghdad procedure.আপনি যদি নাথানিয়েল বোরেস্টেইনের সাথে কক্ষে থাকতেন, আপনি তাকে যুক্তি দিতেন যে এটি আসলে নির্ভর করে এবং তাঁর বক্তব্যটি সঠিক নয়? আমি বোঝাতে চাইছি এটি খুব সুন্দর যে অনেক লোক উত্তর দিচ্ছে, তাদের সময় এবং শক্তি ব্যয় করছে, তবে আমি কোথাও একটিও দৃ concrete় উত্তর দেখতে পাচ্ছি না। স্পাইডি-ইন্দ্রিয়, কোড রিভিউ .. তবে এর উত্তর কী is takeActionOnCity(Action action, City city) better? null?
Koray Tugay

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

2

মান, ব্যবহারযোগ্যতা, প্রযুক্তিগত debtণ ইত্যাদির মতো একই উত্তর:

যেমন পুনর্ব্যবহারযোগ্য হিসাবে আপনি, ব্যবহারকারী, 1 তাদের প্রয়োজন হতে

এটি মূলত একটি রায় আহ্বান - বিমূর্তকরণের নকশা তৈরি এবং রক্ষণাবেক্ষণের ব্যয়টি (= সময় এবং প্রচেষ্টা) দ্বারা পরিশোধ করা হবে কিনা তা আপনাকে লাইনের নিচে সাশ্রয় করবে।

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

1 এটি একটি কোড কনস্ট্রাক্ট, সুতরাং আপনি এই ক্ষেত্রে "ব্যবহারকারী" - উত্স কোডের ব্যবহারকারী


1

আপনি অনুসরণ করতে পারেন একটি পরিষ্কার প্রক্রিয়া আছে:

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

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

জিনিসগুলি কখন জেনেরিক করা যায় এবং কখন বিশেষীকরণ করা যায় এটি আপনাকে খুব স্পষ্ট নির্দেশাবলী দেয়।

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

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

তবে দিনের শেষে, এর বেশিরভাগটি হ'ল মতামত, স্বাদ, অভিজ্ঞতা এবং ব্যক্তিগত পক্ষপাত, তাই এটি সম্পর্কে খুব বেশি হতাশ হবেন না।


আপনার দ্বিতীয় থেকে শেষ অনুচ্ছেদের বিষয়ে - প্রাথমিকভাবে প্রদত্ত "প্রয়োজনীয়তাগুলি" দেখুন, অর্থাৎ প্রথম পদ্ধতিটি যার ভিত্তিতে ছিল। এটি 2018 নির্দিষ্ট করে, সুতরাং কোডটি প্রযুক্তিগতভাবে সঠিক (এবং সম্ভবত আপনার বৈশিষ্ট্য-চালিত পদ্ধতির সাথে মেলে)।
দ্বিজুম

@ দ্বিজুম, প্রয়োজনীয়তা সম্পর্কে এটি সঠিক, তবে পদ্ধতিটির নামটি বিভ্রান্তিকর। 2019 সালে, যে কোনও প্রোগ্রামার কেবল পদ্ধতির নামটি দেখছেন তা ধরে নিবে যে এটি যা কিছু করছে (সম্ভবত বর্তমান বছরের মানগুলি ফিরিয়ে দেবে), 2018 নয় ... আমি কী বলতে চাইছিলাম তা আরও পরিষ্কার করার জন্য আমি উত্তরে একটি বাক্য যুক্ত করব।
AnoE

1

আমি মতামতে এসেছি যে পুনরায় ব্যবহারযোগ্য কোড দুটি ধরণের রয়েছে:

  • কোড যা পুনরায় ব্যবহারযোগ্য কারণ এটি এ জাতীয় মৌলিক, মৌলিক জিনিস।
  • কোড যা পুনরায় ব্যবহারযোগ্য কারণ এর সর্বত্র প্যারামিটার, ওভাররাইড এবং হুক রয়েছে।

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

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

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

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


আমরা কি বলতে পারি যে আপনি যে আমার প্রথম গ্রহণটি ঠিক ছিল, সেখানেও বছরটি হার্ডকোড করা হয়েছিল? অথবা আপনি যদি প্রাথমিকভাবে সেই প্রয়োজনীয়তাটি বাস্তবায়ন করে থাকেন, তবে আপনি কি এই বছরটিকে আপনার প্রথম গ্রহণের পরামিতি হিসাবে তৈরি করবেন?
Koray Tugay

আপনার প্রথম গ্রহণটি ঠিক ছিল, যেহেতু 'কিছু পরীক্ষা করতে' প্রয়োজনীয়তা এক-অফ স্ক্রিপ্ট ছিল। এটি তার 'নীতিগত' পরীক্ষায় ব্যর্থ হয়েছে, তবে তিনি 'নো ডগমা' পরীক্ষায় ব্যর্থ হয়েছে। "তিনি বলতে পারেন ..." আপনার প্রয়োজনীয়তা প্রয়োজন নেই এমন প্রয়োজনীয়তাগুলি আবিষ্কার করছে।
ওয়ারবো

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

আমি দেখতে পাচ্ছি যে আপনি উক্তিটির মালিক নাথানিয়েল বোরেস্টেইনের সাথে একমত নন। আমি এই সমস্ত প্রতিক্রিয়া এবং আলোচনা পড়ে আস্তে আস্তে বুঝতে চেষ্টা করছি।
Koray Tugay

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

1

ইতিমধ্যে অনেক দুর্দান্ত এবং বিস্তৃত উত্তর রয়েছে। তাদের মধ্যে কিছু নির্দিষ্ট বিবরণে গভীরভাবে যায়, সাধারণভাবে সফ্টওয়্যার বিকাশের পদ্ধতির উপর কিছু নির্দিষ্ট দৃষ্টিভঙ্গি রাখে এবং তাদের মধ্যে অবশ্যই বিতর্কিত উপাদান বা "মতামত" ছড়িয়ে পড়ে।

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

একটি পদ্ধতি অন্যটি অনুকরণ করতে পারে কিনা ।

প্রশ্ন থেকে উদাহরণ সম্পর্কে: যে পদ্ধতিটি কল্পনা করুন

void dayLightSavings()

গ্রাহক দ্বারা অনুরোধ করা একটি কার্যকারিতা বাস্তবায়ন ছিল। সুতরাং এটি এমন কিছু হবে যা অন্যান্য প্রোগ্রামারদের ব্যবহার করার কথা ছিল এবং এইভাবে, একটি সর্বজনীন পদ্ধতি হতে হবে in

publicvoid dayLightSavings()

আপনি আপনার উত্তরে যেমন দেখিয়েছিলেন এটি কার্যকর করা যেতে পারে। এখন, কেউ বছরের সাথে এটি পরামিতি করতে চায়। সুতরাং আপনি একটি পদ্ধতি যুক্ত করতে পারেন

publicvoid dayLightSavings(int year)

এবং আসল বাস্তবায়নটি কেবলমাত্রে পরিবর্তন করুন

public void dayLightSavings() {
    dayLightSavings(2018);
}

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

public void dayLightSavings() {
    dayLightSavings(2018, 0, 12, 0, 12, new DateTimeFormatter(...));
}

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

tl; dr :

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


dayLightSavings()কল dayLightSavings(2018)করা আমার কাছে ভাল ধারণা বলে মনে হয় না।
Koray Tugay

@ কোরেতুগে যখন প্রাথমিক অনুরোধটি হ'ল এটি "2018 এর জন্য দিবালোক সঞ্চয়" মুদ্রণ করা উচিত, তবে এটি ঠিক আছে। বাস্তবে, আপনি হ'ল এটিই পদ্ধতি যা আপনি মূলত প্রয়োগ করেছিলেন। যদি এটি " বর্তমান বছরের জন্য দিবালোক সঞ্চয়গুলি মুদ্রণ করা উচিত , তবে অবশ্যই আপনি কল করবেন dayLightSavings(computeCurrentYear());... ...
মার্কো 13

0

থাম্বের একটি ভাল নিয়ম হ'ল: আপনার পদ্ধতিটি ... পুনরায় ব্যবহারযোগ্য হিসাবে পুনরায় ব্যবহারযোগ্য হওয়া উচিত।

আপনি যদি আশা করেন যে আপনি নিজের পদ্ধতিটি কেবলমাত্র এক জায়গায় কল করবেন, এটির কেবলমাত্র পরামিতি থাকা উচিত যা কল সাইটের কাছে পরিচিত এবং যা এই পদ্ধতির জন্য উপলভ্য নয়।

আপনার যদি আরও কলার থাকে, আপনি যতক্ষণ না অন্য কলাররা সেগুলি পরামিতিগুলি পাস করতে পারে ততক্ষণ আপনি নতুন পরামিতিগুলি প্রবর্তন করতে পারেন; অন্যথায় আপনার নতুন পদ্ধতি দরকার।

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


0

আল্ট্রা সংক্ষিপ্ত উত্তর: আপনার জেনেরিক মডিউলটি অন্য কোডের সাথে কম সংযোগ বা নির্ভরতা যত বেশি পুনরায় ব্যবহারযোগ্য হতে পারে।

আপনার উদাহরণ শুধুমাত্র উপর নির্ভর করে

import java.time.*;
import java.util.Set;

তাত্ত্বিকভাবে এটি অত্যন্ত পুনরায় ব্যবহারযোগ্য হতে পারে।

অনুশীলনে আমি মনে করি না যে আপনার দ্বিতীয়বারের মতো ইউসকেস থাকতে হবে যা এই কোডটির প্রয়োজন তাই যজ্ঞ নীতি অনুসরণ করে আমি যদি এই কোডের প্রয়োজন হয় এমন 3 টিরও বেশি প্রজেক্ট না থাকে তবে আমি এটি পুনরায় ব্যবহারযোগ্য করব না।

পুনর্ব্যবহারযোগ্যতার অন্যান্য দিকগুলি হ'ল ব্যবহারের স্বাচ্ছন্দ্য এবং ডোকোমেন্টেশন যা টেস্ট চালিত বিকাশের মূল কারণ : আপনার যদি সাধারণ ইউনিট-পরীক্ষা থাকে যা আপনার জেনেরিক মডিউলের একটি সহজ ব্যবহারকে আপনার লাইব ব্যবহারকারীর জন্য কোডিং উদাহরণ হিসাবে দেখায় তবে তা সহায়ক f


0

আমি সম্প্রতি তৈরি করা একটি বিধি বলার পক্ষে এটি একটি ভাল সুযোগ:

একটি ভাল প্রোগ্রামার হওয়ার অর্থ ভবিষ্যতের ভবিষ্যদ্বাণী করতে সক্ষম হওয়া।

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

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

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

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


0

প্রথমত, 'আমার পদ্ধতিগুলি কীভাবে পুনরায় ব্যবহারযোগ্য হওয়া উচিত তা আমি কীভাবে জানি? "" অভিজ্ঞতা। "এটি কয়েক হাজার বার করুন এবং আপনি সাধারণত সঠিক উত্তরটি পান But তবে টিজার হিসাবে আমি আপনাকে শেষটি দিতে পারি এই উত্তরের লাইন: আপনার গ্রাহক আপনাকে বলবেন যে আপনার কতটা নমনীয়তা এবং কতগুলি সাধারণীকরণের স্তর আপনার উচিত।

এই উত্তরের অনেকের কাছে নির্দিষ্ট টুকরো পরামর্শ রয়েছে। আমি আরও জেনেরিক কিছু দিতে চেয়েছিলাম ... কারণ বিড়ম্বনাটি খুব মজাদার নয়!

কিছু উত্তরে যেমন উল্লেখ করা হয়েছে, সাধারণতা ব্যয়বহুল। তবে, এটি আসলে না। সর্বদা না। পুনরায় ব্যবহারযোগ্যতা গেমটি খেলতে ব্যয়টি বোঝা অপরিহার্য।

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

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

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

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

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

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


ঠিক আছে এমন অন্যান্য লোকেরাও থাকতে হবে যারা এটি 10000 বার করেছেন, তাই আমি কেন এটি 10000 বার করব এবং যখন অন্যের কাছ থেকে শিখতে পারি তখন কেন অভিজ্ঞতা অর্জন করব? কারণ উত্তর প্রতিটি ব্যক্তির জন্য আলাদা হবে তাই অভিজ্ঞদের উত্তরগুলি আমার জন্য প্রযোজ্য নয়? এছাড়াও এই Your customer will tell you how much flexibility and how many layers of generalization you should seek.কি পৃথিবী?
Koray Tugay

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

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

সুতরাং আপনি সম্মত হন যে আমার প্রথম পদ্ধতিরটি সঠিক ছিল, বছরের প্যারামিটারাইজিংয়ের পরিবর্তে প্রথমবারে হার্ডকডিং 2018? (বিটিডব্লিউ, এটি আমার গ্রাহকের কাছে সত্যই শুনছে না বলে আমি মনে করি, আবর্জনার উদাহরণটি That এটি আপনার গ্রাহককে জানছে .. এমনকি ওরাকল থেকে সমর্থন পেলেও শুনতে পারা কোনও সূক্ষ্ম বার্তা নেই যখন সে বলে যে আমাকে দিবালোকের একটি তালিকার দরকার আছে) 2018 এর জন্য পরিবর্তন।) আপনার সময় এবং উত্তর বিটিডব্লিউর জন্য ধন্যবাদ।
Koray Tugay

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

0

কোনও নৈতিকভাবে প্রশিক্ষিত সফ্টওয়্যার ইঞ্জিনিয়ার কোনও ডাস্ট্রোব্যাগদাদ পদ্ধতি লিখতে সম্মত হন না। বেসিক পেশাদার নীতিশাস্ত্রের পরিবর্তে তার একটি ডিস্ট্রোয়সিটি পদ্ধতি লিখতে হবে, যাতে বাগদাদকে প্যারামিটার হিসাবে দেওয়া যেতে পারে।

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

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

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

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

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

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

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

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

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

যথাযথভাবে চিন্তা না করে কঠিন কাজগুলি করবেন না, কারণ একটি রসিকতা আপনাকে বলেছিল। এটা কি দরকারী? এটি কি সেই ডিগ্রিটির জন্য যথেষ্ট সস্তা?


0

এটি আঁকার জন্য একটি সহজ লাইন কারণ আর্কিটেকচার নভোচারীদের দ্বারা নির্ধারিত হিসাবে পুনরায় ব্যবহারযোগ্যতা হ'ল বলক।

অ্যাপ্লিকেশন বিকাশকারীদের দ্বারা তৈরি প্রায় সমস্ত কোড হয় অত্যন্ত ডোমেন নির্দিষ্ট। এটি 1980 নয়। বিরক্ত করার মতো প্রায় সমস্ত কিছুই ইতিমধ্যে একটি কাঠামোর মধ্যে রয়েছে।

বিমূর্ততা এবং সম্মেলনগুলির জন্য ডকুমেন্টেশন এবং শেখার প্রচেষ্টা প্রয়োজন। দয়া করে কেবল এটির জন্য নতুন তৈরি করা বন্ধ করুন। (আমি দিকে তাকিয়ে আছি আপনি , জাভাস্ক্রিপ্ট মানুষ!)

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

আপনার নিয়োগকর্তা কি সব কিছুর জন্য অর্থ প্রদান করে খুশি? আমি না বলতে যাচ্ছি।

বিমূর্ততা হ'ল দাম আমরা নমনীয়তার জন্য প্রদান করি। এটি আমাদের কোডটিকে আরও জটিল এবং বোঝা শক্ত করে তোলে। নমনীয়তা একটি সত্য এবং বর্তমান প্রয়োজন পরিবেশন না করে, ঠিক না, কারণ YAGNI।

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

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

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

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

সমস্ত ইন্ডিরিয়ারেশন আপনার না থাকা সমস্যা সমাধান করে এবং আপনার কোডকে অনেক বেশি করে তোলে পড়া কঠিন করে , যা রক্ষণাবেক্ষণের ব্যয়কে ব্যাপকভাবে বৃদ্ধি করে এবং আপনার নিয়োগকর্তাকে এক বিশাল বিঘ্ন। ভাগ্যক্রমে যে সমস্ত লোকদের এই সম্পর্কে অভিযোগ করা উচিত তারা বুঝতে পারছেন না যে আপনি তাদের সাথে কী করছেন।

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


ঘটনাক্রমে, বিশ্বের সমস্ত দিবালোক সংরক্ষণের পূর্বাভাস দেওয়া সম্ভব নয় । ইস্রায়েলে বিশেষত প্রতিবছর প্রায় 40 টি ট্রানজিশন থাকে যা পুরো জায়গা জুড়ে থাকে কারণ আমরা ভুল সময়ে প্রার্থনা করতে পারি না এবং dayশ্বর দিবালোক সঞ্চয় করেন না।


যদিও আপনি বিমূর্ততা এবং শেখার প্রচেষ্টার বিষয়ে যা বলেছেন তার সাথে আমি একমত এবং বিশেষত যখন এটি "জাভাস্ক্রিপ্ট" নামক ঘৃণার দিকে লক্ষ্য করা হয়, তবুও আমাকে প্রথম বাক্যটির সাথে দৃ strongly়ভাবে একমত হতে হবে না। পুনরায় ব্যবহারযোগ্যতা অনেক স্তরে ঘটতে পারে, এটি খুব বেশি নিচে যেতে পারে এবং নিক্ষেপ-প্রোগ্রাম প্রোগ্রামারদের দ্বারা থ্রো-অ্যাওয়ে কোড লেখা যেতে পারে। কিন্তু হয় অন্তত যারা যথেষ্ট আদর্শবাদী হয় লক্ষ্য পুনর্ব্যবহারযোগ্য কোড করেন। এটির যে উপকারগুলি হতে পারে তা যদি আপনি না দেখেন তবে আপনার জন্য দুঃখের বিষয়।
মার্কো 13

@ মার্কো 13 - যেহেতু আপনার আপত্তি যুক্তিযুক্ত তাই আমি বিষয়টিটি প্রসারিত করব।
পিটার জিতলেন 23

-3

আপনি যদি কমপক্ষে জাভা 8 ব্যবহার করে থাকেন তবে আপনি ওয়ার্ল্ডটাইমজোনস ক্লাসটি টাইম জোনের সংকলন বলে মনে হচ্ছে তা সরবরাহ করার জন্য লিখবেন।

তারপরে ওয়ার্ল্ডটাইমজোন ক্লাসে একটি ফিল্টার (প্রডিকেট ফিল্টার) পদ্ধতি যুক্ত করুন। এটি কলারকে প্যারামিটার হিসাবে ল্যাম্বডা এক্সপ্রেশনটি পাস করার মাধ্যমে তারা যে কোনও কিছুতে ফিল্টার করার ক্ষমতা সরবরাহ করে।

সংক্ষেপে, একক ফিল্টার পদ্ধতি প্রিডিকেটকে দেওয়া মানের মধ্যে থাকা যে কোনও কিছুতে ফিল্টারিং সমর্থন করে।

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


3
এগুলি ভাল জেনারালাইজেশন ধারণাগুলি তবে এই উত্তরটি প্রশ্নটিতে যা বলা হচ্ছে তার চিহ্নটি পুরোপুরি মিস করে। প্রশ্নটি কীভাবে সমাধানটিকে সর্বাধিক সাধারণীকরণ করা যায় তা নয় তবে আমরা সাধারণীকরণে লাইনটি কোথায় আঁকি এবং কীভাবে আমরা এই বিবেচনাগুলিকে নৈতিকভাবে ওজন করব।
ম্যাপেল_শ্যাফ্ট

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