Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Объектно-ориентированное программирование   Найти похожие ветки 

 
reg24r ©   (2005-08-02 20:23) [0]

Я не очень силен в ООП и поэтому хотел бы получить ответ на следующий вопрос:
В программе необходимо предусмотреть несколько пользователей
с сохранением имени и пароля скажем в текстовом файле.
Как грамотно решить эту задачу с использованием принципов объектно-ориентированного программирования?


 
TUser ©   (2005-08-02 20:26) [1]

Не-силёность в ООП не помешает тебе хранить пароли пользователей, причем весьма надежно. Только не надо хранить их в текстовом файле.


 
Гаврила ©   (2005-08-02 20:29) [2]


> Как грамотно решить эту задачу с использованием принципов
> объектно-ориентированного программирования?


Полагаю, первое, что надо сделать - это создать класс, и назвать его TUser
:-)))


 
reg24r ©   (2005-08-02 20:29) [3]

Где хранить пароли сейчас не суть важно.
Хотелось бы ответ на вопрос получить.


 
reg24r ©   (2005-08-02 20:32) [4]

Уважаемый Гаврила
вы не могли бы немного тему дальше раскрыть.


 
Fay ©   (2005-08-02 20:33) [5]

2 reg24r ©   (02.08.05 20:29) [3]
Вы, конечно, извините, но вопрос довольно глупый.
Спросили бы ещё "Как грамотно решить эту задачу в свете решений XIX съезда компартии Уругвая?"...


 
TUser ©   (2005-08-02 20:33) [6]

Я могу
type
TMe = class;

TMe := TMe.Create;


 
reg24r ©   (2005-08-02 20:34) [7]

Для вас глупый для других нет


 
TUser ©   (2005-08-02 20:35) [8]

Имеется в виду, что ООП как таковое не имеет к задаче никакого отношения.


 
reg24r ©   (2005-08-02 20:43) [9]

ООП как таковое может иметь отношение к задачке любого уровня
даже такой простой. Или?


 
Fay ©   (2005-08-02 20:46) [10]

2 reg24r ©   (02.08.05 20:43) [9]
Мы вчера с отцом ходили в горы.
Да?


 
reg24r ©   (2005-08-02 20:48) [11]

Действительно здесь можно получить ответ на ЛЮБОЙ вопрос.


 
Fay ©   (2005-08-02 20:51) [12]

2 reg24r ©   (02.08.05 20:48) [11]

Откройте свои лекции по технологии программирования. Там всё (должно быть) написано.


 
reg24r ©   (2005-08-02 20:52) [13]

У меня нет лекций, не учился я этому делу в институте.


 
Гаврила ©   (2005-08-02 20:53) [14]


> reg24r ©


Эта тема слишком обширна для ответа в форуме. Для этого нужна минимум хорошая статья, максимум книга


 
reg24r ©   (2005-08-02 20:55) [15]

А если написать эту статью?
Могу вопросы начинающего подкинуть.
Получится очень интересно.


 
Fay ©   (2005-08-02 20:56) [16]

2 reg24r ©   (02.08.05 20:55) [15]
Читать готовые тоже бывает интересно.


 
reg24r ©   (2005-08-02 21:04) [17]

Когда достигнешь определенного уровня, то уже не помнишь
какие проблемы интересовали тебя когда начинал и соответственно ничего путевого написать не получается.
Читал много статей, везде
описание создания класса,методы,поля и т.д. и т.п.
Это есть в любой книге.
Как это все применить вот в чем вопрос.
И вот здесь начинаются проблемы у писателей.
Вначале они пишут:"это все для начинающих"
Однако описывается все о так, что понимают только те кто это уже знает.
Зачем такое писать,не понятно.


 
TUser ©   (2005-08-02 21:10) [18]

Да, было бы ООП, остальное - фигня, так?


 
Fay ©   (2005-08-02 21:25) [19]

2 reg24r ©   (02.08.05 21:04) [17]
Предполагается, что у читающего есть голова, а в ней - мозги.
Проектирование классов - это такая штука, там думать надо...
А в статьях пишут какие БУКВЫ писать.


 
Джо ©   (2005-08-02 21:33) [20]

А вот мне делать нечего %-)
В свете последних ООП-технологий, скелет такого приложения может выглядеть так :)

{
 Модуль с менеджером пользователей
 Добавляет глобальную переменную UserManager
}
unit LoginMgr;

interface
uses SysUtils, Classes, Contnrs;

type
 TUser = class
 private
   FUserName,
   FPassword: string;
   procedure Logoff;
   function CheckLoginInfo (const AUserName, APassword: string): Boolean;
 public
   constructor Create (const AUserName, APassword: string);
   procedure CustomizeApplication;
   property UserName: string read FUserName;
   property Password: string read FPassword;
 end;

 TUserManager = class
 private
   FUserList: TObjectList;
   FCurrentUser: TUser;
 public
   function Login (const AUserName, APassword: string): Boolean;
   function TryLoginInteractively: Boolean;
   procedure Logoff;
   // ссылка на текущего пользователя
   // т.е, последнего успешно залогинившегося
   property CurrentUser: TUser read FCurrentUser;
   procedure LoadUsersFromFile (const AFileName: string);
   constructor Create;
   destructor Destroy; override;
 end;

var
 UserManager: TUserManager;

implementation
uses Forms, Controls, ExtCtrls, StdCtrls, Dialogs;

// диалоговое окно с запросом
function ShowLoginDlg (var AUserName, APassword: string): Boolean;
var
 Frm: TForm;
 EditUserName,
 EditPassword: TLabeledEdit;
 BtnOK, BtnCancel: TButton;
begin
 Result := False;
 Frm := TForm.Create(nil);
 try
   with Frm do
   begin
     Frm.Caption := "Login";
     BorderStyle := bsDialog;
     Position := poScreenCenter;
     Width := 180;
     Height := 160;
   end;

   EditUserName := TLabeledEdit.Create(Frm);
   with EditUserName do
   begin
     EditLabel.Caption := "Login:";
     Parent := Frm;
     Left := 2;
     Top := 20;
   end;

   EditPassword := TLabeledEdit.Create(Frm);
   with EditPassword do
   begin
     PasswordChar := "*";
     EditLabel.Caption := "Password:";
     Parent := Frm;
     Left := 2;
     Top := 60;
   end;

   BtnOK := TButton.Create(Frm);
   with BtnOK do
   begin
     Parent := Frm;
     Caption := "OK";
     Left := 10;
     Top := Frm.Height - BtnOK.Height - 40;
     ModalResult := mrOK;
     Default := True;
   end;

   BtnCancel := TButton.Create(Frm);
   with BtnCancel do
   begin
     Parent := Frm;
     Caption := "Cancel";
     Left := 20 + BtnOk.Width;
     Top := Frm.Height - BtnCancel.Height - 40;
     ModalResult := mrCancel;
     Cancel := True;
   end;

   if Frm.ShowModal = mrOK then
   begin
     AUserName := EditUserName.Text;
     APassword := EditPassword.Text;
     Result := True;
   end;

 finally
   Frm.Free;
 end;
end;

{ TUserManager }

constructor TUserManager.Create;
begin
 inherited;
 FUserList := TObjectList.Create (True);
 Logoff
end;

destructor TUserManager.Destroy;
begin
 FUserList.Free;
 inherited;
end;
//
// эту процедуру необходимо переписать с учетом шифрования данных
//
procedure TUserManager.LoadUsersFromFile(const AFileName: string);
var
 Lst: TStrings;
 I: Integer;
 AUserName,
 APassword: string;
 procedure SplitString (const ASource: string; var AUserName,APassword: string);
 const
   Delimiter: Char = ",";
 var
   N: Integer;
 begin
   AUserName := "";
   APassword := "";
   N := Pos (Delimiter,ASource);
   AUserName := Copy (ASource,1,N-1);
   APassword := Copy (ASource,N+1,Length(ASource));
 end;
begin
 {
   Формат файла:
   UserName1,Password1
   UserName2,Password2
   ...
   Остальные данные для конкретного пользователя
   Также можно хранить здесь
 }
 Lst := TStringList.Create;
 try
   Lst.LoadFromFile(AFileName);
   for I := 0 to Lst.Count-1 do
   begin
     SplitString(Lst[I],AUserName,APassword);
     FUserList.Add(TUser.Create(AUserName,APassword))
   end;
 finally
   Lst.Free;
 end;
end;

// пробуем залогиниться с указанными именем и паролем
// в случае успеха возвращаем True.
function TUserManager.Login(const AUserName, APassword: string): Boolean;
var
 I: Integer;
begin
 Result := False;
 FCurrentUser := nil;
 for I := 0 to FUserList.Count-1 do
   if TUser(FUserList[I]).CheckLoginInfo(AUserName,APassword) then
   begin
     FCurrentUser := TUser(FUserList[I]);
     Result := True;
     Break
   end
end;

procedure TUserManager.Logoff;
begin
 if FCurrentUser <> nil then
   FCurrentUser.Logoff;
end;

function TUserManager.TryLoginInteractively: Boolean;
var
 AUserName,
 APassword: string;
begin
 Result := False;
 while UserManager.CurrentUser = nil do
 begin
   if not ShowLoginDlg(AUserName,APassword) then
     Break;
   if not UserManager.Login(AUserName,APassword) then
     MessageDlg ("Incorrect login/password",mtError,[MBOK],-1)
   else
     Result := True;
 end;
end;

{ TUser }

function TUser.CheckLoginInfo(const AUserName, APassword: string): Boolean;
begin
 Result :=
   (AnsiUpperCase(AUserName) = AnsiUpperCase(FUserName)) and
   (APassword = FPassword)
end;

constructor TUser.Create(const AUserName, APassword: string);
begin
 FUserName := AUserName;
 FPassword := APassword;
end;

{ TInvalidUser }

procedure TUser.CustomizeApplication;
begin
 // сдесь устанавливаем свойства приложения
 // в зависимости от данных пользователя
 // например, изменим заголовок главной формы...
 Application.MainForm.Caption :=
   Format ("Пользователь %s, пароль %s",[FUserName,FPassword])
end;

procedure TUser.Logoff;
begin
 Application.MainForm.Caption := "Нет пользователя"
end;

initialization
 UserManager := TUserManager.Create;
 // читаем данные о пользователях из файла
 UserManager.LoadUsersFromFile("d:\users.txt");
 {
   Образец файла данных с 2-мя пользователями
   --------------------
   sergey,psw1
   admin,psw2
 }

finalization
 UserManager.Logoff;
 UserManager.Free;
end.

Образец приложения.
Создаем пустое приложение с одной формой.
Файл проекта:

program Project2;

uses
 Forms,
 Dialogs,
 Unit1 in "Unit1.pas" {Form1},
 LoginMgr in "LoginMgr.pas";

{$R *.res}

begin
 Application.Initialize;

 // предлагаем залогиниться
 if not UserManager.TryLoginInteractively then
   Halt(1); // ну, и не надо :-)

 Application.CreateForm(TForm1, Form1);

 // Применяем настройки текущего пользователя
 UserManager.CurrentUser.CustomizeApplication;

 Application.Run;
end.

В общем, учись, студент ;-)
Вопросы по сути дела - приветствуются. Вопросы, показывающие полное непомимание предмета - игнорируются и огорчают :-))


 
Гаврила ©   (2005-08-02 22:37) [21]


>  [20] Джо ©  



> А вот мне делать нечего %-)


Воистину так :-)))


 
k2 ©   (2005-08-03 04:23) [22]

Джо ©   (02.08.05 21:33)
может ещё методы encode/decode добавить?
уважаемый пацан да ещё в свете ООП кроме кракозябров в таких файлах ничегож хранить правов не имеет :о)


 
Гаврила ©   (2005-08-03 10:21) [23]


> уважаемый пацан да ещё в свете ООП кроме кракозябров в таких
> файлах ничегож хранить правов не имеет :о)


А совсем уважаемый пацан вообще не имеет правов хранить такое в файлах
:-) Ибо файл подменить можно


 
Джо ©   (2005-08-03 14:37) [24]


>  [23] Гаврила ©   (03.08.05 10:21)


> [22] k2 ©   (03.08.05 04:23)

За загрузку сведений о пользователях отвечает один-единственный метод. Который, при необходимости, и правится соответствующим образом. Хоть с СУБД по SSL-соединению запрашивай, хоть откуда хош. Кроме того, пацан написал:
> [3] reg24r ©   (02.08.05 20:29)
> Где хранить пароли сейчас не суть важно.


 
reg24r ©   (2005-08-03 14:43) [25]

Уважаемый Джо
Сообщите мне ваш домашний адрес на Емайл reg24r@web.de,
я перечислю вам 30$.
Не могу оставить без внимания ваше желание помочь.
Остальным маленький совет, если вам лень больше 3 строчек написать, нефиг сюда заходить.


 
Digitman ©   (2005-08-03 14:59) [26]

за эти $30. смею заметить, ты мог бы приобрести (хоть в тундре !) вполне приличный "букварь" по "основам" (и не только)



Страницы: 1 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.069 c
14-1122453914
Slider007
2005-07-27 12:45
2005.08.21
Кем я хочу стать когда я буду большим


14-1122886819
SergeyDon
2005-08-01 13:00
2005.08.21
цифровой фотоаппарат изнутри?


14-1122574119
Yanis
2005-07-28 22:08
2005.08.21
Отрубить бдительность WindowsXP


4-1120045400
SPeller
2005-06-29 15:43
2005.08.21
Заставить IE перечитать настройки


1-1122906825
Starcom
2005-08-01 18:33
2005.08.21
Как в приложении вызвать процедуру для вывода изображения из RES