Как не забыть порядок параметров

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

Модератор: Модераторы

Как не забыть порядок параметров

Сообщение hinst » 28.03.2014 21:56:14

Хочу поделиться решением которое я придумал чтобы не забывать порядок параметров, как например в функции Pos(a, b), где надо сначала указывать что искать, а потом где искать, или наоборот, первым параметром где искать, а вторым параметром что искать, так вот:

Я придумал создать такой модуль:
Код: Выделить всё
unit StringPosU;

{$Mode ObjFPC}

interface

uses
  types, strutils;

type
  PPos = ^TPos;

  { TPos }

  TPos = object
  public
    What: string;
    Where: string;
    function SetWhat(const a: string): PPos;
    function SetWhere(const a: string): PPos;
    function Eval: Integer;
    procedure Clear;
  end;

function Pos: TPos;

implementation

{ TPos }

function TPos.SetWhat(const a: string): PPos;
begin
  What := a;
  result := @self;
end;

function TPos.SetWhere(const a: string): PPos;
begin
  Where := a;
  result := @self;
end;

function TPos.Eval: Integer;
begin
  result := system.Pos(What, Where);
end;

procedure TPos.Clear;
begin
  What := '';
  Where := '';
end;

{ NoClass }

function Pos: TPos;
begin
  result.Clear;
end;

end.


И затем можно писать вот так вот:
Код: Выделить всё
  WriteLN( Pos.SetWhat('lawl')^.SetWhere('At first I lawld')^.Eval );


Благодаря вызовам SetWhat и SetWhere намного сложнее перепутать порядок параметров, память здесь утекать не будет, так как объект создаётся в стеке
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Как не забыть порядок параметров

Сообщение скалогрыз » 29.03.2014 01:14:03

месье знает толк в извращениях!
hinst писал(а):И затем можно писать вот так вот:
Код: Выделить всё
  WriteLN( Pos.SetWhat('lawl')^.SetWhere('At first I lawld')^.Eval );


из процедурного языка сделать функциональный :D
на самом деле, синтаксически, это чем-то напоминает способ передачи параметров в ObjC, но с точки зрения реализации совсем не то.
Код: Выделить всё
[myRect setWidth:10.0 height:20.0];

или даже нотацию в jQuery.
Код: Выделить всё
$("div.test").add("p.quote").addClass("blue").slideDown("slow");


Как ни странно, но очевидны преймущества над запустанным и непонятным вызвом в паскале :mrgreen:
Код: Выделить всё
Pos('eval','At first I lawld');


P.S. пожалуйста, не издевайтесь над языком.
Последний раз редактировалось скалогрыз 29.03.2014 06:21:15, всего редактировалось 1 раз.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как не забыть порядок параметров

Сообщение SSerge » 29.03.2014 05:01:43

Вообще-то, самый простой и логичный подход - в классике :D

Код: Выделить всё
string s="1234567";
int i=s.IndexOf("3");


То есть, когда данные содержат в своей реализации все методы работы с ними, это очень удобно :D И, в общем, порядок аргументов по источнику-приёмнику получается естественным образом.

зы: не стоит обращать внимание, что код не паскалевский, это не важно. Чисто иллюстрация самого подхода.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Как не забыть порядок параметров

Сообщение скалогрыз » 29.03.2014 05:29:10

SSerge писал(а):зы: не стоит обращать внимание, что код не паскалевский, это не важно. Чисто иллюстрация самого подхода.

Делфи.НЕТовский
Код: Выделить всё
i:=s.IndexOf("3");

длиннее, чем
Код: Выделить всё
  i:=Pos('3', s);

на 3 символа :)

SSerge писал(а):То есть, когда данные содержат в своей реализации все методы работы с ними, это очень удобно :D И, в общем, порядок аргументов по источнику-приёмнику получается естественным образом.

немного не так. Заранее всех методов предусмотреть невозможно, а если и сделать это, так базовый класс получиться ужасно громоздким (100+ методов и больше).
Данные действительно могут содержать все методы работы с ними, но только в случае использования прототипов. Т.е. базовый класс содержит минимум методов, и их набор расширяется за счёт подключаемых модулей.

Т.к. прототипов в паскале нет, то "расширять" можно успешно используя процедуры и функции.
Маленький плюс использования процедур/функций над методами (в случае прототипов или class-helper-ов) - это отсутствие коллизий имён.
(а всё потому что паскаль модульный!)

P.S. ещё можно предложить такую вещь
Код: Выделить всё
function IndexOf(const str, substr: string): Integer;

но я не буду этого делать.

P.P.S. я так понимаю hinst просто испытывает ненависть к CodeTools, которые почему-то показывает Pos(a,b) вместо Pos(substr, str). Где-то объявления функций друг на друга накладываются?!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как не забыть порядок параметров

Сообщение sign » 29.03.2014 05:57:08

Народ, хорош дурака валять.
Ctrl+<пробел> и где какие параметры ясно, как белый свет.
1.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Как не забыть порядок параметров

Сообщение скалогрыз » 29.03.2014 06:23:28

да, вот именно эту ненависть я и имею в виду.
30 функций Pos() и лишь у 5 из них указан конкретно source и substr :)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как не забыть порядок параметров

Сообщение stanilar » 31.03.2014 14:15:39

Паттерну из первого поста стока лет, что забыл его название. Его суть - в возврате методом ссылки на собственный объект.

IMHO (потому как не проверял в лазаре и не использовал для строк):

Что касается Дот нетовского
Код: Выделить всё
i:=s.IndexOf("3");

то в паскале и это можно легко реализовать, если помнить как идет работа в методах объекта:
Код: Выделить всё
i:=TPos(s).IndexOf("3");


Напомню: каждый метод содержит две ссылки - на класс и на объект (экземпляр класса). Когда делается приведение TPos(s) объектная ссылка станет ссылкой на строку, и можно будет написать следующий код:

Код: Выделить всё
function TPos.IndexOf: Integer;
begin
  result := Pos('3', string(self));
end;


Как говорится, вас ограничивает только ваша фантазия.

З.Ы. код написан на коленке

Добавлено спустя 11 минут 32 секунды:
Кстати, мне думается (по поводу первого поста), что писать
Код: Выделить всё
result := @self;

излишне, просто
Код: Выделить всё
result := self;
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Как не забыть порядок параметров

Сообщение sign » 01.04.2014 07:57:09

скалогрыз писал(а):да, вот именно эту ненависть я и имею в виду.
30 функций Pos() и лишь у 5 из них указан конкретно source и substr :)

Да неужели!
Я только на вскидку сразу увидел под двадцать однозначно понятных функций.
Помимо тех функций, у которых однозначно понятные названия параметров (вами указанные), все те, у коих один из параметров (и как ни странно, он всегда первый :) ) есть char, widechar, ansichar.
И беглого взгляда на этот список функций достаточно, чтобы понять, что и как.

Так что, ваша ненависть, это просто разновидность религиозной нетерпимости.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Как не забыть порядок параметров

Сообщение Сквозняк » 03.04.2014 02:45:58

А почему просто не создать для функции обёртку у которой все параметры будут разных типов а вводить их туда через функции преобразователи типов с названиями типа cjo_vvodim и nahren_eto_nado? Тогда точно не перепутаешь и указатели не понадобятся.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: Как не забыть порядок параметров

Сообщение sign » 03.04.2014 06:59:31

Сквозняк писал(а):А почему просто не создать для функции обёртку у которой все параметры будут разных типов а вводить их туда через функции преобразователи типов с названиями типа cjo_vvodim и nahren_eto_nado? Тогда точно не перепутаешь и указатели не понадобятся.

А потому что это нафиг никому не нужно.
Ctrl-пробел - и всё ясно.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Как не забыть порядок параметров

Сообщение скалогрыз » 03.04.2014 08:02:04

sign писал(а):Да неужели! Я только на вскидку сразу увидел под двадцать однозначно понятных функций.

а я наглядно объясню! Функций Pos - всего 30 в списке. из них 6 (а не 5 как я раньше писал), которые явно указывают на назначние параметров: "substr" и "source". Названия, вроде "c" и "v" мне кажутся не информативными вообще - неясно их назначение. (Список прилагаю, где опиясния Pos посчитаны и + помечены хорошие)

Например, из этого описания, нифига не ясно ни что функция делает, ни что параметры обозначают. Так же из Pos.
Код: Выделить всё
function ReplaceStringWithAdvance(const c: string; w: Boolean; v: variant): Boolean;

Опытные программисты (sign) просто "знают", что "substr" идёт первым :)... соответственно неопытные (h**st) ещё не привыкли :mrgreen:

Кроме ctrl+space, есть ещё и замечательноая контекстная помощь ctrl+shift+space. Которая при вводе параметров, перечислит возможные варианты типов. К сожаленю, результат её работы хуже, чем у Ctrl+space. Т.к. нету ни одной функции с информативными параметрами. (скриншот приалагаю). Обращаю в нимание, что в одним описание идёт Pos( v, w) а в другом Pos(w, v)... т.е. имени переменной верить ну никак нельзя ;)
---
но это только с наименованием пременных такое веселье.
по-моему личному мнению, что такое обилие разных функций может стильно вогнать в ступор особенно новичков.
читаем описания функции
"Search for substring in a string."
Казалось бы задачя простая, а функций 30. Новичёк не поймёт не сразу, но опытные люди (опять sign и hinst) знают - чтобы избежать спорных конвертаций типов.
Приведение выполняется явно в каждой реализации функции pos (см. systemh.inc, astrings.inc, wstringh.inc).
Ведь для выполнения:
Код: Выделить всё
  Pos('a', 'aaa');

Код: Выделить всё
  Pos('aa', 'aaa');

вызваются две разные функции! (в первом случае Char, во втором ShortString). Но с точки зрения пользователя (программиста), задача одна и таже - поиск подстроки в строке...
ну и конечно, если была бы всего одна функция Pos(const substr, source: string) - она тоже бы работала для всех случаев (просто не так эффективно).
Спасибо паскалю за неявное преведение строковых типов друг к другу.

Ну и самый интересный Вариант, это такой:
Код: Выделить всё
uses ..Variants..

if Pos(1, $A0)>0 then writeln('found');

и ведь работает! :mrgreen: строгая типизация! строгая типизация! :mrgreen:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как не забыть порядок параметров

Сообщение Сквозняк » 04.04.2014 01:53:48

sign писал(а):А потому что это нафиг никому не нужно.Ctrl-пробел - и всё ясно.

А если лазарус не найдёт нужную инклуду то покажет кукиш. То есть весь мусор нужно вручную включать в проект.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: Как не забыть порядок параметров

Сообщение sign » 04.04.2014 06:38:07

скалогрыз писал(а):Функций Pos - всего 30 в списке. из них 6 (а не 5 как я раньше писал), которые явно указывают на назначние параметров: "substr" и "source". Названия, вроде "c" и "v" мне кажутся не информативными вообще - неясно их назначение. (Список прилагаю, где опиясния Pos посчитаны и + помечены хорошие)

Человеку, который порешит, что среди этого списка функций параметры у некоторых поменяны местами, не следует идти в программисты.
В парикмахеры, там, в дизайнеры, но не в программисты.

Добавлено спустя 2 минуты 41 секунду:
Сквозняк писал(а):А если лазарус не найдёт нужную инклуду то покажет кукиш. То есть весь мусор нужно вручную включать в проект.

?

Т.е., некто станет использовать некую функцию, не понимая, что, она, зачем она и вообще, что там у неё за параметры?

А если честно, то я вообще не понял, о чём это вы.
Примером поразите меня, пожалуйста.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Как не забыть порядок параметров

Сообщение SSerge » 04.04.2014 08:28:21

sign писал(а):Человеку, который порешит, что среди этого списка функций параметры у некоторых поменяны местами, не следует идти в программисты.


То, что верно для ЭТОГО списка функций, не обязательно может быть верным для других случаев;
во всяком случае, коллега дело говорит, что наименования параметров во многих случаях, в т.ч. в стандартных библиотеках, не информируют совершенно об их предназначении. А уж когда в перегруженной для другого типа аргумента функции параметр начинает внезапно называться не "src", а "b", не "dest", а "c" - то это как раз безобразие.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Как не забыть порядок параметров

Сообщение sign » 05.04.2014 05:56:42

SSerge, я предпочитаю предметный разговор.
Пример стандартной библиотеки и с "невнятными" параметрами функций.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

След.

Вернуться в Разное

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26

Рейтинг@Mail.ru