هل هذه الطريقة سليمة من الناحية المنطقية و البرمجية
#1
السلام عليكم، مرحبا بالجميع.

هل هذه الطريقة سليمة من الناحية المنطقية و البرمجية
وبماذا تنصحون
وفي الاخير تقبلوا شكري الجزيل

كود :
[align=left]nit Unit1;[/align]
[align=left]interface[/align]

[align=left]uses[/align]
[align=left]  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,[/align]
[align=left]  Dialogs, StdCtrls, ComCtrls, Unit2,DateUtils;[/align]

[align=left]type[/align]
[align=left]  TForm1 = class(TForm)[/align]
[align=left]    Button1: TButton;[/align]
[align=left]    Edit1: TEdit;[/align]
[align=left]    DateTimePicker1: TDateTimePicker;[/align]
[align=left]    Label1: TLabel;[/align]
[align=left]    Label2: TLabel;[/align]
[align=left]    Edit2: TEdit;[/align]
[align=left]    Label3: TLabel;[/align]
[align=left]    Button2: TButton;[/align]
[align=left]    procedure Button1Click(Sender: TObject);[/align]
[align=left]    procedure Button2Click(Sender: TObject);[/align]
[align=left]  end;[/align]

[align=left]  TEnterEmployee = class(Tds)[/align]
[align=left]  private[/align]
[align=left]   fDateE: TDate;[/align]
[align=left]   procedure SetLDate(ALDate: TDate); override;[/align]
[align=left]   function GetLDate: TDate; override;[/align]
[align=left]  end;[/align]

[align=left]  TSortieEmployee = class(Tds)[/align]
[align=left]  private[/align]
[align=left]   fDateS: TDate;[/align]
[align=left]   procedure SetLDate(ALDate: TDate); override;[/align]
[align=left]   function GetLDate: TDate; override;[/align]
[align=left]  end;[/align]

[align=left]var[/align]
[align=left]  Form1: TForm1;[/align]

[align=left]implementation[/align]

[align=left]{$R *.dfm}[/align]

[align=left]procedure TForm1.Button1Click(Sender: TObject);[/align]
[align=left]var[/align]
[align=left] d1: Tds;[/align]
[align=left]begin[/align]
[align=left] d1:= TEnterEmployee.Create;[/align]
[align=left] try[/align]
[align=left]   d1.NameFirst := Edit1.Text;[/align]
[align=left]   d1.NameLast := Edit2.Text;[/align]
[align=left]   d1.LDate := DateTimePicker1.Date;[/align]
[align=left]   //[/align]
[align=left]   Label1.Caption := d1.NameFirst;[/align]
[align=left]   Label2.Caption := d1.NameLast;[/align]
[align=left]   Label3.Caption := DateToStr(d1.LDate);[/align]
[align=left] finally[/align]
[align=left]  d1.Free[/align]
[align=left] end;[/align]
[align=left]end;[/align]

[align=left]procedure TForm1.Button2Click(Sender: TObject);[/align]
[align=left]var[/align]
[align=left] d1: Tds;[/align]
[align=left]begin[/align]
[align=left] d1:= TSortieEmployee.Create;[/align]
[align=left] try[/align]
[align=left]   d1.NameFirst := Label1.Caption;[/align]
[align=left]   d1.NameLast := Label2.Caption;[/align]
[align=left]   d1.LDate := StrToDate(Label3.Caption);[/align]
[align=left]   //[/align]
[align=left]   Edit1.Text := d1.NameFirst;[/align]
[align=left]   Edit2.Text := d1.NameLast;[/align]
[align=left]   DateTimePicker1.Date := d1.LDate;[/align]
[align=left] finally[/align]
[align=left]  d1.Free[/align]
[align=left] end;[/align]
[align=left]end;[/align]

[align=left]function TEnterEmployee.GetLDate: TDate;[/align]
[align=left]begin[/align]
[align=left]  Result := fDateE[/align]
[align=left]end;[/align]

[align=left]procedure TEnterEmployee.SetLDate(ALDate: TDate);[/align]
[align=left]begin[/align]
[align=left] if YearOf(Now)-YearOf(ALDate)>17 then[/align]
[align=left]   fDateE := ALDate;[/align]
[align=left]end;[/align]

[align=left]function TSortieEmployee.GetLDate: TDate;[/align]
[align=left]begin[/align]
[align=left]  Result := fDateS[/align]
[align=left]end;[/align]

[align=left]procedure TSortieEmployee.SetLDate(ALDate: TDate);[/align]
[align=left]begin[/align]
[align=left]  fDateS := ALDate[/align]
[align=left]end;[/align]

[align=left]end.[/align]

[align=left]-----------[/align]
[align=left]unit Unit2;[/align]

[align=left]interface[/align]
[align=left]uses Controls;[/align]
[align=left]type[/align]
[align=left]  Tds = class[/align]
[align=left]  protected[/align]
[align=left]   fNameFirst,fNameLast: string;[/align]
[align=left]   procedure SetLDate(ALDate: TDate); virtual; abstract;[/align]
[align=left]   function GetLDate: TDate; virtual; abstract;[/align]
[align=left]  public[/align]
[align=left]   property NameFirst: string read fNameFirst write fNameFirst;[/align]
[align=left]   property NameLast: string read fNameLast write fNameLast;[/align]
[align=left]   property LDate: TDate read GetLDate write SetLDate;[/align]
[align=left]  end;[/align]
[align=left]implementation[/align]
[align=left]end.[/align]

كود :
nit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Unit2,DateUtils;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    DateTimePicker1: TDateTimePicker;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

  TEnterEmployee = class(Tds)
  private
   fDateE: TDate;
   procedure SetLDate(ALDate: TDate); override;
   function GetLDate: TDate; override;
  end;

  TSortieEmployee = class(Tds)
  private
   fDateS: TDate;
   procedure SetLDate(ALDate: TDate); override;
   function GetLDate: TDate; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 d1: Tds;
begin
 d1:= TEnterEmployee.Create;
 try
   d1.NameFirst := Edit1.Text;
   d1.NameLast := Edit2.Text;
   d1.LDate := DateTimePicker1.Date;
   //
   Label1.Caption := d1.NameFirst;
   Label2.Caption := d1.NameLast;
   Label3.Caption := DateToStr(d1.LDate);
 finally
  d1.Free
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 d1: Tds;
begin
 d1:= TSortieEmployee.Create;
 try
   d1.NameFirst := Label1.Caption;
   d1.NameLast := Label2.Caption;
   d1.LDate := StrToDate(Label3.Caption);
   //
   Edit1.Text := d1.NameFirst;
   Edit2.Text := d1.NameLast;
   DateTimePicker1.Date := d1.LDate;
 finally
  d1.Free
 end;
end;

function TEnterEmployee.GetLDate: TDate;
begin
  Result := fDateE
end;

procedure TEnterEmployee.SetLDate(ALDate: TDate);
begin
 if YearOf(Now)-YearOf(ALDate)>17 then
   fDateE := ALDate;
end;

function TSortieEmployee.GetLDate: TDate;
begin
  Result := fDateS
end;

procedure TSortieEmployee.SetLDate(ALDate: TDate);
begin
  fDateS := ALDate
end;

end.


كود :
unit Unit2;

interface
uses Controls;
type
  Tds = class
  protected
   fNameFirst,fNameLast: string;
   procedure SetLDate(ALDate: TDate); virtual; abstract;
   function GetLDate: TDate; virtual; abstract;
  public
   property NameFirst: string read fNameFirst write fNameFirst;
   property NameLast: string read fNameLast write fNameLast;
   property LDate: TDate read GetLDate write SetLDate;
  end;
implementation
end.
الرد
#2
انت وضعت كود كامل الوحدة . وتريد مننا استنتاج عن ماذا تتحدث انت ؟!
١ ـ لا تضع كل الكود. لا يهم كل الكود .. ضع فقط الاسطر التي لها علاقة .
٢ ـ اشرح عن ماذا تتحدث . وما الذي حدث معك .. لا تتوقع مننا ان نستنتج ماذا تريد .

شكرا لتفهمك . فما طلبي هذا إلا لجعل الموقع اكثر افادة .

************** رد منقول للفائدة *************
من قال حاد عن أصله أو قال مات فقد كذب
[-] كل من 1 user says قال شكرا ل h-farid على المشاركة المفيدة
  • sabre
الرد
#3
نعم انا وضعت كود كامل الوحدة
هذا من أجل  أن يفهم الذي يطلع على الكود
هل برمجة بهذه طريقة صحيحة ومقبولة والكود سليم أقصد ليس فيه أخطاء
وهل يجوز البرمجة بهذه الطريقة

قلت من الناحية المنطقية والبرمجية
...
ممكن أن يكون كود صحيح برمجيا ومقبول
ولكن من فيه أخطاء منطقية أو الاثنين معا

أنا أعتقد أن أي أحد له دراية بالبرمجة يكون باستطاعته
أن يفهم الكود، الكود ليس طويل

انت نقلت تعليق استاذ سامر اسيل
لأنني وضعت السؤال في موقعه
الرد
#4

السلام عليكم
لم اجرب الكود او اطلع عليه و اجيبك عامة
طرق البرمجة مختلفة ما يهم ان يعمل
لا مشاكل مع الCOMPILER
لا مشاكل عندما تجرب تنفيذه انت
لا مشاكل عندما يجربه غيرك

ملاحظة:دائما حاولارفاق الكود كاملا بالمرفقات حتى يسهل تحميله وتجربته.
بالتوفيق
رَبَّنَا اغْفِرْ لِي وَلِوَالِدَيَّ وَلِلْمُؤْمِنِينَ يَوْمَ يَقُومُ الْحِسَابُ
[-] كل من 1 user says قال شكرا ل محمد عبد العزيز على المشاركة المفيدة
  • sabre
الرد
#5
شكرا للأستاذ B.M.AbdelAziZ على النصيحة
و شكرا للأستاذ h-farid على النصيحة

abstract
التجريد، بمعنى دالة أو اجراء  ليس لهما جسم، مجرد رؤوس فقط
virtual
الافتراضي ، بمعنى أن الدالة أو الاجراء يمكن أن نستعمل اسميهما الداخل الفئات المشتقة من الفئة التي هما فيها
override
المهيمن، بمعنى أنه يهيمن على الاجراء أو الدالة افتراضيين

هذه الدالة في الفئة الام
function GetLDate: TDate; virtual;
هذه الدالة في الفئة المشتقة
function GetLDate: TDate; override;

(14-05-2019, 11:52 PM)sabre كتب : شكرا للأستاذ B.M.AbdelAziZ على النصيحة
و شكرا للأستاذ h-farid على النصيحة

abstract
التجريد، بمعنى دالة أو اجراء  ليس لهما جسم، مجرد رؤوس فقط
virtual
الافتراضي ، بمعنى أن الدالة أو الاجراء يمكن أن نستعمل اسميهما الداخل الفئات المشتقة من الفئة التي هما فيها
override
المهيمن، بمعنى أنه يهيمن على الاجراء أو الدالة افتراضيين

هذه الدالة في الفئة الام
function GetLDate: TDate; virtual;
هذه الدالة في الفئة المشتقة
function GetLDate: TDate; override;


الملفات المرفقة
.rar   dd.rar (الحجم : 2.83 ك ب / التحميلات : 7)
الرد
#6
هل قصدت ناحية الOOP؟, لأنك لم توضح ما الذي تريد عمله من الكلاس, تسميتك للمعرفات غير توضيحية, الباقي يبدو سليما, ليس هناك ما يلاحظ سوى نقل تعريف الكلاسات المشتقة الى Unit2, ونقل ما تحت Protected الى Private, ما دام أنهم في نفس الوحدة.
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم