আমার দলের অন্যান্য প্রোগ্রামারদের কাছে আমার কোডটি আরও পাঠযোগ্য Need


11

আমি ডেলফিতে একটি প্রকল্পে কাজ করছি এবং আমি অ্যাপ্লিকেশনটির জন্য একটি ইনস্টলার তৈরি করছি, এখানে তিনটি প্রধান অংশ রয়েছে।

  1. PostgreSQL ইনস্টলেশন / আনইনস্টলেশন
  2. মায়াপ্লিকেশন (এনএসআই ব্যবহার করে মায়াপ্লিকেশন সেটআপ করা হয়) ইনস্টলেশন / আনইনস্টলেশন।
  3. স্ক্রিপ্টের মাধ্যমে পোস্টগ্রাজে টেবিল তৈরি করা হচ্ছে (ব্যাচ ফাইলগুলি)।

প্রতিটি জিনিস জরিমানা চলে এবং সহজে, কিন্তু যদি কিছু ব্যর্থ হয় আমি একটা LogToFileger যা প্রক্রিয়া ধাপে ধাপে LogToFile হবে তৈরি করেছেন
এই মত

LogToFileToFile.LogToFile('[DatabaseInstallation]  :  [ACTION]:Postgres installation started');

ফাংশন LogToFileToFile.LogToFile()এটি একটি ফাইলে বিষয়বস্তু লিখবে। এটি দুর্দান্তভাবে কাজ করছে, তবে সমস্যাটি কোডটি বিশৃঙ্খলা করে ফেলেছে কারণ কোডটি পড়া খুব কঠিন হয়ে পড়েছে কারণ কেবল একটি সিএ LogToFileToFile.LogToFile()কোডের সর্বত্রই ফাংশন কল দেখতে পান

একটি উদাহরণ

 if Not FileExists(SystemDrive+'\FileName.txt') then
 begin
    if CopyFile(PChar(FilePathBase+'FileName.txt'), PChar(SystemDrive+'\FileName.txt'), False) then
       LogToFileToFile.LogToFile('[DatabaseInstallation] :  copying FileName.txt to '+SystemDrive+'\ done')
       else
       LogToFileToFile.LogToFile('[DatabaseInstallation] :  copying FileName.txt to '+SystemDrive+'\ Failed');
 end;
 if Not FileExists(SystemDrive+'\SecondFileName.txt')      then
   begin
     if CopyFile(PChar(FilePathBase+'SecondFileName.txt'), PChar('c:\SecondFileName.txt'), False) then
       LogToFileToFile.LogToFile('[DatabaseInstallation] : copying SecondFileName.txt to '+SystemDrive+'\ done')
   else
       LogToFileToFile.LogToFile('[DatabaseInstallation] :  copying SecondFileName.txt to '+SystemDrive+'\ Failed');
 end;

আপনি দেখতে পাচ্ছেন যে এখানে প্রচুর LogToFileToFile.LogToFile()কল
ছিল before

 if Not FileExists(SystemDrive+'\FileName.txt') then
    CopyFile(PChar(FilePathBase+'FileName.txt'), PChar(SystemDrive+'\FileName.txt'), False) 
 if Not FileExists(SystemDrive+'\SecondFileName.txt')      then
   CopyFile(PChar(FilePathBase+'SecondFileName.txt'), PChar('c:\SecondFileName.txt'), False)

এটি এখন আমার পুরো কোডের ক্ষেত্রে।
এটি পড়া কঠিন।

লগটোফায়লে কল কল বন্ধ করার জন্য কি কেউ আমাকে সুন্দর উপায় প্রস্তাব করতে পারেন?

মত

  1. 'লগোটোফাইলেটফুফিল.লগটোওফাইলে () Ind এইভাবে কল করা
    হচ্ছে

       if Not FileExists(SystemDrive+'\FileName.txt') then
         begin
             if CopyFile(PChar(FilePathBase+'FileName.txt'), PChar(SystemDrive+'\FileName.txt'), False) then
            {Far away--->>}                   LogToFileToFile.LogToFile(2,'[DatabaseInstallation] :  [ACTION]:copying FileName.txt to '+SystemDrive+'\ sucessful')
       else
            {Far away--->>}                   LogToFileToFile.LogToFile(2,'[DatabaseInstallation] :  [ACTION]:copying FileName.txt to '+SystemDrive+'\ Failed');
       end;
    
  2. পৃথক ইউনিট মত LogToFileger
    এই ইউনিট একটি সমস্ত LogToFile বার্তা থাকবে switch caseভালো

     Function LogToFilegingMyMessage(LogToFilegMessage : integer)
    
     begin
    case  LogToFilegMessage of
    
    1         :  LogToFileToFile.LogToFile(2,'[DatabaseInstallation] :  [ACTION]:copying FileName.txt to '+SystemDrive+'\ sucessful');
    2         :  LogToFileToFile.LogToFile(2,'[DatabaseInstallation] :  [ACTION]:copying FileName.txt to '+SystemDrive+'\ Failed');
       150        :  LogToFileToFile.LogToFile(2,'[somthing] :  [ACTION]: somthing important);
    
    end;
    

সুতরাং যেখানে প্রয়োজন সেখানে আমি কেবলমাত্র লগটোফিলিংমাইমেসেজ (1) কল করতে পারি।

কেউ কি আমাকে বলতে পারেন যে এইভাবে লগটোফাইলেগিংয়ের জন্য আরও ভাল এবং ক্লিনার পদ্ধতির কী?


5
আপনার বিষয়ের জবাব দেওয়ার জন্য: আপনি কি আপনার দলটিকে বুঝতে চেষ্টা করেছেন বা তারা যদি তা বোঝে বা তা বোঝার চেষ্টা করে? যদি হ্যাঁ, তবে এটি "পর্যাপ্ত" পঠনযোগ্য হওয়া উচিত।
Spoike

@ স্পাইকে: আমি জিজ্ঞাসা করেছি, এটি পড়া খুব সামান্য, যেমনই সর্বত্রই এর logBook.log()মুখোমুখি হয়।
প্রেসলিডিয়াস

1 থেকে 3 নাম্বারযুক্ত "দুটি প্রধান অংশ রয়েছে" আমার মনে হয় আপনি কেন পঠনযোগ্যতার বিষয়ে প্রশ্ন রেখেছেন তা আমি দেখেছি। ধারাবাহিকতার জন্য আপনি এমন কাউকে খুঁজে পেতে চাইতে পারেন যিনি "সম্পাদনা" করতে পারেন।
এস.লট

@ এস.লোট আমি 'দুটি' থেকে 'তিন' সম্পাদনা করেছেন .. ভুলের জন্য
একত্রী

এছাড়াও আপনি চেষ্টা করতে পারেন codereview.stackexchange.com
কার্ক Broadhurst

উত্তর:


11

আপনি লগিং যোগ করার সময়, আপনি দুটি জিনিস চালু করেছেন:

  1. কোড বড় হয়ে গেছে কারণ প্রায় প্রতিটি ক্রিয়াকলাপের জন্য, আপনি এমন একটি লাইন যুক্ত করেছেন যা সেই ক্রিয়াটিকে লগ করে (বা এটির ব্যর্থতা)
  2. লগ লাইনগুলি এগুলি নিজেরাই ফুলে উঠেছে বলে মনে হয় এবং পাঠযোগ্যতা থেকে দূরে সরিয়ে নেয় কারণ তারা এত বেশি জায়গা নেয়।

এগুলির প্রত্যেকেরই নিজস্ব নিজস্ব, তুলনামূলক সহজ সমাধান রয়েছে:

  1. কোডটি ছোট ফাংশনে বিভক্ত করুন। আপনার সমস্ত অনুলিপি পাশাপাশি ত্রুটি / সাফল্যের জন্য লগ বার্তাগুলি ধারণ করে এমন একটি বিশাল ফাংশন না করে আপনি "কপিরাইট ফাইল" একটি ফাংশন প্রবর্তন করতে পারেন, এটি হ'ল একটি ফাইল অনুলিপি করে এবং লগের নিজস্ব ফলাফল। এইভাবে আপনার মূল কোডটিতে কেবল কপিরাইট ফাইল থাকবে এবং এটি পড়তে সহজ হবে।

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

আপনি যদি (1) অনুসরণ করেন তবে আপনার এমন কোড থাকতে পারে যা দেখতে দেখতে এটির মতো:

CopyFile( sOSDrive, 'Mapannotation.txt' )
CopyFile( sOSDrive, 'Mappoints.txt' )
CopyFile( sOSDrive, 'Mapsomethingelse.txt' )
. . . .

তারপরে আপনার কপিরাইট ফাইল () এর ক্রিয়াটি করতে এবং এর ফলাফলটি লগ করার জন্য কেবল কয়েকটি লাইন কোডের প্রয়োজন, যাতে আপনার সমস্ত কোড সংক্ষিপ্ত এবং পড়তে সহজ হয়।

আমি আপনার পদ্ধতির # 2 থেকে দূরে থাকব কারণ আপনি বিভিন্ন মডিউলগুলিতে একসাথে থাকা উচিত এমন তথ্যগুলি বিচ্ছিন্ন করে দিচ্ছেন। আপনি আপনার লগ স্টেটমেন্টগুলির সাথে সিঙ্ক থেকে বেরিয়ে আসার জন্য আপনার মূল কোডের জন্য জিজ্ঞাসা করছেন। তবে লগমিমেজেজ (5) এর দিকে তাকিয়ে আপনি কখনই তা জানতে পারবেন না।

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

আমি মনে করি এটি মেনমা যা প্রস্তাব করেছিলেন তা অনেক বেশি। প্রকৃত স্ট্রিং পাস করার পরিবর্তে ধ্রুবককে সংজ্ঞায়িত করুন (সি / সি ++ / সি # তে, তারা এনুমিউমেশন টাইপের অংশ হবে)। সুতরাং উপাদানগুলির জন্য উদাহরণস্বরূপ, আপনার কাছে থাকতে পারে: ডিবিআইনস্টল, অ্যাপফাইলেস, রেজিস্ট্রি, শর্টকাটস ... কোডটি ছোট করে এমন কোনও কিছু পড়তে সহজ করে তোলে।

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

সুতরাং আপনার ফাইলের অনুলিপি করা লাইনগুলি দেখতে এরকম কিছু দেখাচ্ছে:

Bool isSuccess = CopyFile(PChar(sTxtpath+'Mapannotation.txt'), PChar(sOSdrive+'\Mapannotation.txt'), False)
LogBook.Log( DbInstall, FileCopy, isSuccess, 'Mapannotation.txt', sOSDrive )

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

আপনি এখানে থিমটি দেখেন, তাই না? কম পুনরাবৃত্তি কোড -> আরও পঠনযোগ্য কোড।


+1, আপনি কি আমাকে you could pass in enumerations values এই সম্পর্কে আরও বলতে পারেন ?
প্রেসলেডিয়াস

@ প্রেসলিডিয়াস: আপডেট পোস্ট
ডিএক্সএম

ঠিক আছে, হ্যাঁ কম পুনরাবৃত্তি -> আরও পঠনযোগ্য কোড
প্রেসলিডিয়াস

2
+1 "কোডটি ছোট ফাংশনে বিভক্ত করুন।" আপনি যথেষ্ট চাপ দিতে পারবেন না। এটি কেবল এতগুলি সমস্যা কেবল অদৃশ্য হয়ে যায়।
অলিভার ওয়েইল

10

দেখে মনে হচ্ছে আপনার একটি "লগবেবলএকশন" ধারণাটি বিমূর্ত করা দরকার। আমি আপনার উদাহরণে একটি প্যাটার্ন দেখছি যেখানে সমস্ত কলগুলি সাফল্য বা ব্যর্থতা নির্দেশ করার জন্য একটি বিল ফিরিয়ে দেয় এবং লগ বার্তাটি হ'ল একমাত্র পার্থক্য।

বহু বছর পরে আমি ডেলফি লিখেছি তাই এটি অনেকটা সি # অনুপ্রাণিত সিউডো-কোড তবে আমি ভাবতাম যে আপনি এর মতো কিছু চান

void LoggableAction(FunctionToCallPointer, string logMessage)
{
    if(!FunctionToCallPointer)
    {  
        Log(logMessage).
    }
}

তারপরে আপনার কলিং কোডটি হয়ে যায়

if Not FileExists(sOSdrive+'\Mapannotation.txt') then
    LoggableAction(CopyFile(PChar(sTxtpath+'Mapannotation.txt'), "Oops, it went wrong")

আমি ফাংশন পয়েন্টারগুলির জন্য ডেল্ফি সিনট্যাক্সটি মনে করতে পারি না তবে বাস্তবায়নের বিবরণ যাই হোক না কেন, লগের রুটিনের চারপাশে কিছু প্রকার বিমূর্ততা আপনি যা খুঁজছেন তা মনে হয়।


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

+1, LoggableAction()এটি দুর্দান্ত, আমি চেকিং এবং লেখার পরিবর্তে প্রত্যক্ষিত মানটি লিখতে পারি।
প্রেসলেডিয়াস

আমি +১০, দুর্দান্ত উত্তর চাই, তবে আমি কেবল একটি উত্তর গ্রহণ করতে পারি :( .. আমি আমার পরবর্তী প্রয়োগটিতে এই পরামর্শটি চেষ্টা করব, ধারণাটির জন্য ধন্যবাদ
প্রেসলেডিয়াস

3

একটি সম্ভাব্য পদ্ধতির ধ্রুবক ব্যবহার করে কোড হ্রাস করা।

if CopyFile(PChar(sTxtpath+'Mapannotation.txt'), PChar(sOSdrive+'\Mapannotation.txt'), False) then
   LogBook.Log(2,'[POSTGRESQL INSTALLATION] :  [ACTION]:copying Mapannotation.txt to '+sOSdrive+'\ sucessful')
   else
   LogBook.Log(2,'[POSTGRESQL INSTALLATION] :  [ACTION]:copying Mapannotation.txt to '+sOSdrive+'\ Failed');

হবে:

if CopyFile(PChar(sTxtpath+'Mapannotation.txt'), PChar(sOSdrive+'\Mapannotation.txt'), False) then
   Log(2, SqlInstal, Action, CopyMapSuccess, sOSdrive)
   else
   Log(2, SqlInstal, Action, CopyMapFailure, sOSdrive)

স্ক্রিনে অক্ষরের সংখ্যা গণনা করার সময় যার আরও ভাল লগ কোড / অন্যান্য কোড অনুপাত রয়েছে।

এটি আপনার প্রশ্নের দ্বিতীয় দফায় আপনি যা বলেছিলেন তার কাছাকাছি, আমি এতদূর যেতে পারব না: Log(9257)স্পষ্টতই এর চেয়ে সংক্ষিপ্ত Log(2, SqlInstal, Action, CopyMapSuccess, sOSdrive), তবে পড়াও বেশ কঠিন difficult 9257 কি? এটা কি সাফল্য? আপনি উত্তর দিবেন না? এটি কি এসকিউএল এর সাথে সম্পর্কিত? আপনি যদি এই কোডবেসে গত দশ বছর ধরে কাজ করেন তবে আপনি সেই সংখ্যাগুলি হৃদয় দিয়ে শিখতে পারবেন (যদি কোনও যুক্তি থাকে তবে 9XXx সাফল্যের কোড, এক্স 2 এক্সএক্সএক্স এসকিউএল সম্পর্কিত হয় ইত্যাদি) তবে আবিষ্কার করে এমন এক নতুন বিকাশকারীর জন্য কোডবেস, শর্ট কোডগুলি একটি দুঃস্বপ্ন হবে।

দুটি পদ্ধতির মিশ্রন করে আপনি আরও যেতে পারেন: একটি একক ধ্রুবক ব্যবহার করুন। ব্যক্তিগতভাবে, আমি এটি করব না। হয় আপনার ধ্রুবক আকারে বৃদ্ধি পাবে:

Log(Type2SuccessSqlInstallCopyMapSuccess, sOSdrive) // Can you read this? Really?

বা অবিচলিত সংক্ষিপ্ত থাকবে, তবে খুব স্পষ্ট নয়:

Log(T2SSQ_CopyMapSuccess, sOSdrive) // What's T2? What's SSQ? Or is it S, followed by SQ?
// or
Log(CopyMapSuccess, sOSdrive) // Is it an action? Is it related to SQL?

এটিতেও দুটি ঘাটতি রয়েছে। তোমাকে করতে হবে:

  • তাদের পৃথক স্থায়ীদের লগ সম্পর্কিত তথ্য পৃথক তালিকা রাখুন। একক ধ্রুবক সহ, এটি দ্রুত বাড়বে।

  • আপনার দলে একটি একক ফর্ম্যাট প্রয়োগ করার একটি উপায় সন্ধান করুন। উদাহরণস্বরূপ, পরিবর্তে যদি T2SSQকেউ লিখতে সিদ্ধান্ত নেবে ST2SQL?


+1, ক্লিন logকলের জন্য, তবে আপনি কি আমাকে Log(2, SqlInstal, Action, CopyMapFailure, sOSdrive)বোঝাতে পারেন যে এটি বুঝতে পারেনি , আপনি বলতে চাচ্ছেন SqlInstalআমার সংজ্ঞায়িত পরিবর্তনশীলটি কি এর মতো হবে SqlInstal:=[POSTGRESQL INSTALLATION] ?
প্রেসলেডিয়াস

@ প্রিসলিডিয়াস: SqlInstalউদাহরণস্বরূপ একটি মান যে কোনও হতে পারে 3। তারপরে, Log()এই মানটি [POSTGRESQL INSTALLATION]লগ বার্তার অন্যান্য অংশগুলির সাথে সম্মিলিত হওয়ার আগে কার্যকরভাবে অনুবাদ করা হবে ।
আর্সেনি মরজেনকো

single format in your teamএকটি ভাল / দুর্দান্ত বিকল্প
প্রেসলিডিয়াস

3

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

procedure CopyIfFileDoesNotExist(filename: string);
var
   success: boolean;
begin
   if Not FileExists(sOSdrive+'\'+filename') then
   begin
      success := CopyFile(PChar(sTxtpath+filename), PChar(sOSdrive+filename), False);

      Log(filename, success);
   end;
end;

procedure Log(filename: string; isSuccess: boolean)
var
   state: string;
begin
   if isSuccess then
   begin
      state := 'success';
   end
   else
   begin
      state := 'failed';
   end;

   LogBook.Log(2,'[POSTGRESQL INSTALLATION] : [ACTION]:copying ' + filename + ' to '+sOSdrive+'\ ' + state);
end;

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


+1, সাদা স্পেসগুলি দুর্দান্ত উপায় .. success := CopyFile()ধারণার জন্য ধন্যবাদ, এটি আমার ক্ষেত্রে কোডের কিছু অপ্রয়োজনীয় লাইন কমিয়ে দেবে
প্রেসলেডিস

@ এস রবিন্স আমি কি আপনার কোডটি সঠিকভাবে পড়েছি? আপনার পদ্ধতি LogIfFileDoesNotExistকপি ফাইল বলা হয় ?
জোও পোর্তেলা

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

আপনি যে সমস্যাটি সমাধান করতে সময় নিয়েছেন তা দেখে ভাল লাগল, +1।
জোও পোর্তেলা

2

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

পরিবর্তে আমি এই জাতীয় কিছু করব:

void logHelper(String phase, String message) {
   LogBook.Log(2, "[" + phase + "] :  [Action]: " + message);
}

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

if (!FileExists(sOSdrive+'\Mapannotation.txt')) {
    if (CopyFile(PChar(sTxtpath+'Mapannotation.txt'), PChar(sOSdrive+'\Mapannotation.txt'), False)) {
       logHelper(POSTGRESQL, 'copying Mapannotation.txt to '+ sOSdrive +'\ sucessful')
    } else {
       logHelper(POSTGRESQL, 'copying Mapannotation.txt to '+ sOSdrive +'\ Failed');
    }
}

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


1

এই লাইন বরাবর কিছু সম্পর্কে:

LogBook.NewEntry( 2,'POSTGRESQL INSTALLATION', 'copying Mapannotation.txt to '+sOSdrive);

if CopyFile(PChar(sTxtpath+'Mapannotation.txt'), PChar(sOSdrive+'\Mapannotation.txt'), False) then
    LogBook.Success()
else
    LogBook.Failed();

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

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