Текущий архив: 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.54 MB
Время: 0.024 c