¡Buen Año Nuevo a todos! En este artículo, me gustaría contarles cómo tuve que volver a un proyecto heredado en Pascal, literalmente antes de despedirme de él, de Lazarus y de la ausencia de un tema oscuro fuera de la caja .
La última vez les expliqué que no soy programador de profesión, pero que uso mi pasatiempo favorito para automatizar todo lo que se me presenta en el trabajo de un abogado. Estoy seguro de que el 90% de toda la burocracia legal se puede automatizar con éxito: mantener una variedad de bases de datos y tarjetas, elaborar documentos según plantillas, controlar el tiempo de las tareas, utilizar cualquier servicio auxiliar que ya tenga su propia API para atornillar la automatización en un lugar de trabajo específico, etc. etc. Es necesario esforzarse por lograr esto para, según los pedidos de Isaac Asimov, liberar el tiempo de un abogado para la implementación de la tarea principal: reflexionar sobre los términos del contrato y generar demagogia en los tribunales.
Entonces, hace muchos años hice un proyecto muy grande para facilitar el trabajo de mi oficina. Recopiló todos los datos sobre marcas registradas y patentes (y hay varios cientos de ellas), controló el momento del pago de las tasas de patente, formuló órdenes de pago, contratos, solicitudes y, por supuesto, emitió varios informes. En realidad, ¿por qué en pasado? El proyecto está funcionando bastante. Simplemente se desarrolló de acuerdo con todos los posibles antipatrones, con todas las bicicletas y muletas que solo se encontraron en la Tierra. Volviendo a este código de Rolton (o doshirak) para refactorizarlo, no quería, porque el meme " Reescribamos todo en ... " es perfecto aquí .
Pero, desafortunadamente, reescribir todo de nuevo en un nuevo idioma para una nueva plataforma o incluso para varias es un negocio largo y prolongado, y los documentos deben estar sellados aquí y ahora. Por tanto, tengo que volver a Pascal de vez en cuando.
Uno de los días hermosos, todo el proyecto se reconstruyó en una plataforma de 64 bits y, para mi sorpresa, cayó la parte más favorita: la generación de contratos y declaraciones con la automatización completa de toda la gramática y morfología: la declinación de iniciales, posiciones y otras palabras en los casos necesarios, y Véase también singular / plural. Es que la antigua librería Delphic y padegUC propietaria ha dejado de ser gratuita en su versión de 64 bits.
32- , . .
- , . , :
IInitialsMorpher = interface
function GetInitials(Initials: string): CasesResponse;
function GetWordsCase(Words: string): CasesResponse;
function GetGenderAndInitials(Initials: string; var Gender: TGender): CasesResponse;
end;
, , -: (.. ), , , , , , .. CasesResponse , Gender - :
TWordCase = (Nominative, Gentitive, Dative, Accusative, Instrumental, Prepositional);
TGender = (Male, Female, UnrecognizedGender);
CasesResponse = array[TWordCase] of string;
. , :
, Morphos, / .
rest api, json, , http, :
generic function JSONfromRestUri<T>(Uri: string): T;
var
HTTPSender: THTTPSend;
JSONStreamer: TJSONDeStreamer;
Json: TJSONObject;
begin
HTTPSender := THTTPSend.Create;
JSONStreamer := TJSONDeStreamer.Create(nil);
HTTPSender.Clear;
Result := T.Create;
if not HTTPSender.HTTPMethod('GET', Uri) then
raise EInOutError.Create(RESTOUT_ERROR);
JSON := GetJSON(HTTPSender.Document) as TJSONObject;
JSONStreamer.JSONToObject(JSON, Result);
FreeAndNil(JSON);
FreeAndNil(JSONStreamer);
FreeAndNil(HTTPSender);
end;
Freepascal Synapse Fpjson, (httpsend, fpjson, fpjsonrtti) uses. json rtti, .. , -, published, -, (, , ), -, json. , @SerializedName , .
Morphos :
MORPHOS_URL = 'http://morphos.io/api/inflect-name?name=%s&_format=json';
json , - / , , name gender:
{
"name": " ",
"cases": [
" ",
" ",
" ",
" ",
" ",
" "
],
"gender": "m"
}
IInitialsMorpher Morpher. , json Fpjson ( , TPersistent):
TMorphosResponse = class(TPersistent)
private
fCases: TStrings;
fGender: string;
fName: string;
public
constructor Create;
destructor Destroy; override;
published
property name: string read fName write fName;
property cases: TStrings read fCases write fCases;
property gender: string read fGender write fGender;
end;
:
TMorphosImpl = class(TInterfacedObject, IInitialsMorpher)
public
function GetInitials (Initials: string): CasesResponse;
function GetWordsCase (Words: string): CasesResponse;
function GetGenderAndInitials(Initials: string; var Gender: TGender): CasesResponse;
end;
, :
function TMorphosImpl.GetGenderAndInitials(Initials: string; var Gender: TGender): CasesResponse;
var
inf: TWordCase;
i: integer = 0;
response: TMorphosResponse;
begin
response := specialize JSONfromRestUri<TMorphosResponse>
(Replacetext(Format(MORPHOS_URL, [Initials]), ' ', '+'));
for inf in TWordCase do begin
Result[inf] := response.cases[i];
inc(i);
end;
case response.gender of
'm': Gender := Male;
'f': Gender := Female;
else Gender := UnrecognizedGender;
end;
FreeAndNil(response);
end;
, . , ( ) , , - :
function TMorphosImpl.GetInitials(Initials: string): CasesResponse;
var
MokeGender: TGender = UnrecognizedGender;
begin
Result := GetGenderAndInitials(Initials, MokeGender);
end;
function TMorphosImpl.GetWordsCase(Words: string): CasesResponse;
var
inf: TWordCase;
begin
Result := GetInitials(Words);
for inf in TWordCase do
Result[inf] := UTF8LowerString(Result[inf]);
end;
- -, ( , , - ?) - http-. Morphos , DaData , 10 .
, . , json ashMap- Generics.Collections - , freepascal delphi. , - ( , http- , ).
Morphos :
Morpher := TMorphFabric.Create(MORPHOS);
//...
response := Morpher.GetInitials(Text)
StringList.AddStrings(response);
Para todos los interesados, mantendré mi biblioteca resultante con una aplicación de ventana de prueba para ganar en un repositorio abierto . Lo más probable es que no empiece nada en él, porque ahora me he sumergido en el mar abierto del desarrollo móvil (kotlin) y python para implementar el mismo "reescribir todo en ..."
¡Feliz año nuevo 2020 + '1' a todos!