Модератор: Модераторы
{$mode objfpc}
{$modeswitch typehelpers}
{$modeswitch allowinline}
type
TStringUtils = type helper for String
function IndexOf(const Sub: String): Integer; inline;
end;
function TStringUtils.IndexOf(const Sub: String): Integer;
begin
Result := Pos(Sub, Self);
end;
begin
Writeln('ABCDEF'.IndexOf('CD'));
end.
float Power(float, float);
Pos(substr = 'lawl', str = 'aw');
result := TPos.Create('lawl').SetSubStr('aw').Eval;
result := Pos('lawl').SetSubStr('aw').Eval;
result := Pos.SetStr('lawl').SetSubStr('aw').Eval;
var
pos: TPos;
begin
pos.Str := 'lawl';
pos.SubStr := 'aw';
result := pos.Eval;
result := Pos(substr: 'lawl', str: 'aw');
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();
hinst писал(а):Я думаю, что фичу делать не надо, так как решение есть, которое я описал.
hinst писал(а): Это я видел в жабе:
- Код: Выделить всё
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();
Называется pattern Builder, и используется он там немного для других целей, как я понял, для того, чтобы создать объект и сразу назначить ему некоторые значения для свойств
пример отсюда: http://habrahabr.ru/post/86252/
Добавлено спустя 3 минуты 8 секунд:
то есть, там предлагают это использовать для создания экземпляров классов и назначения им свойств, а не для того, чтобы использовать это как вызов функции с именоваными параметрами, как это предлагаю я
var
p: TPos;
begin
p.SearchWhat('bla').search(); // а вот SearchWhere я не вызвал.
type
{ TPos }
TPos = class
public
What: string;
Where: string;
end;
TPosArg = object
o: TPos;
end;
{ TPosFinal }
TPosFinal = object(TPosArg)
function Eval: Integer;
end;
{ TPosWhat }
TPosWhat = object(TPosArg)
function SetWhat(const s: string): TPosFinal;
end;
{ TPosWhere }
TPosWhere = object(TPosArg)
function SetWhere(const s: string): TPosWhat;
end;
function Pos: TPosWhere;
...implementation...
{ TPosWhere }
function TPosWhere.SetWhere(const s: string): TPosWhat;
begin
o.Where := s;
result.o := o;
end;
{ TPosFinal }
function TPosFinal.Eval: Integer;
begin
result := system.Pos(o.What, o.Where);
o.Free;
end;
{ TPosWhat }
function TPosWhat.SetWhat(const s: string): TPosFinal;
begin
o.What := s;
result.o := o;
end;
{ NoClass }
function Pos: TPosWhere;
begin
result.o := TPos.Create;
end;
begin
WriteLN(
Pos.SetWhere('lawl').SetWhat('aw').Eval
);
end.
Pos.SetWhere('lawl').SetWhat('aw').Eval // можно
Pos.SetWhat('aw').Eval // нельзя
Pos.SetWhat('aw').SetWhere('lawl').Eval // нельзя
function FindSubInStr(const sub, s: string): Integer; {inline; - по желанию}
begin
Result:=Pos(sub, s);
end;
SSerge писал(а):Вам уже перечислили конкретную библиотеку и конкретную функцию, наименования параметров которой ни о чем не говорят, к тому же экземпляры для разных типов аргументов эти самые параметры именуют по-разному; что есть безусловное зло, но вам этого не понять, потому что вы изначально встали в позицию отрицания;
hinst писал(а):Я знаю как ещё и сделать чтобы нельзя было пропустить нужный параметр:
hinst писал(а):не всё так просто
hinst писал(а):не всё так просто
function Pos(sub, s: string) as FindSubInStr(const sub, s: string): Integer;
Mirage писал(а):Выучивать - путь к ошибкам.
Mirage писал(а):P.S.: На builder паттерн наехали зря, т.к. он нужен и удобен для безопасного создания immutable объектов, когда у объекта имеются необязательные параметры.
Mirage писал(а):Обязательные задаются при создании builder'а, читаем внимательней.
Mirage писал(а):Было бы очень здорово, если бы immutable объекты давали те же гарантии в FPC, что и в Java.
Но т.к. иммутабельных объектов в FPC нет, то данный паттерн можно реализовать без дополнительного класса, просто сделав чтобы методы-сеттеры дополнительных параметров возвращали экземпляр того же класса.
Mirage писал(а):Это модно называть fluent interfaces. Толку, правда, от этого мало.
Wikipedia писал(а):...нацеленный на повышение читабельности исходного кода программы....
program project1;
{$Mode ObjFPC}
type
TLal = record
x, y: Integer;
end;
const
lal: TLal = (x: 0; y: 0);
var
lal2: TLal;
begin
lal2 := lal;
end.
begin
lal2 := (x: 0; y: 0);
// или так
lal2 := TLal(x: 0; y: 0);
end.
Pos( TPos(sub: '23'; str: '1234') );
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1