Sign in Join
Wiki copytemporary

Unit/pt: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Unit/pt

OldNewLine
1+Uma **unit** é um arquivo de [[Source code|código fonte]] (ou o [[Binary|binário]] compilado a partir desse [[File|arquivo]]) o qual foi escrito usando um dialeto da linguagem de programação [[Pascal]]. Uma **unit** foi planejada para ser uma unidade, um módulo único de uma [[Application|aplicação]] ou um [[Object module|módulo objeto]].
2+
3+## Objetivo
4+
5+Uma unidade pode ser usada onde funcionalidade necessita ser fornecida, seja a um programa de computador, a um módulo objeto ou a outras unidades. Ela permite escrever código que implementa essa funcionalidade uma vez e a usa em diferentes lugares. Ao se aumentar a reutilização de uma unidade cujo código já é conhecido e testado, a chance de erro humano se reduz.
6+
7+Uma unidade binária pode ser usada quando o autor de uma unidade deseja fornecer uma funcionalidade a um programa Pascal, mas não pode fornecer o código fonte correspondente àquela funcionalidade.
8+
9+Em versões antigas do Pascal, unidades também eram usadas em computadores com recursos limitados. Elas eram necessárias por serem capazes de carregar [[Routine|rotinas]] por demanda ao invés de deixá-las na memória do programa executável todo o tempo.
10+
11+Uma unidade que precise acessar, e. g.  [[Procedure|procedimentos]] e [[Data type|tipos de dados]] em outra unidade, precisa especificar essa unidade por meio da cláusula [[Uses]]. Uma vantagem é que o processo de ligação entre unidades e executável (linking) é feito sem a necessidade de se escrever arquivos de tipo "makefile", como na linguagem de programação C.
12+
13+Uma unidade pode ainda ser usada para se declarar uma série de [[Const|constantes]] ou [[Global variables|variáveis]] globais, sem necessariamente conter qualquer código executável. Isso é similar à palavra-chave `common` na linguagem de programação Fortran.
14+
15+## Formato
16+
17+Uma unidade é definida com a palavra-chave *unit* seguida por um identificador de uma unidade. O identificador da unidade (no exemplo a seguir o nome da unidade é "minimalunit") deve corresponder ao nome do arquivo da unidade no qual ele está escrito. Um exemplo mínimo seria:
18+
19+``` pascal
20+unit minimalunit;
21+interface
22+ { declarações de funcionalidade pública, ao se
23+ incluir esta unidade por meio da cláusula 'uses' }
24+implementation
25+ { implementação de funcionalidade pública }
26+ { implementação de funcionalidade privada,
27+ acessível apenas por esta unidade, é opcional }
28+end.
29+```
30+
31+onde a parte após *interface* corresponde ao públicamente acessível por outras unidades e *implementation* ao acessível apenas a unidade 'minimalunit' de forma privada.
32+
33+Uma outra estrutura mínima mais avançada seria:
34+
35+``` pascal
36+unit advancedunit;
37+interface
38+ { público ao se incluir na cláusula 'uses' }
39+implementation
40+ { privado }
41+initialization
42+ { código executado quando a unidade é inicializada,
43+ ao início do programa }
44+
45+finalization
46+ { código executado quando a unidade é finalizada,
47+ ao final do programa }
48+
49+end.
50+```
51+
52+Os blocos *initialization* e *finalization* são opcionais.
53+
54+### Exemplo detalhado de uma unidade
55+
56+``` pascal
57+{
58+
59+ Descrição da unidade.
60+
61+}
62+unit randomunit;
63+
64+{ essa unidade não depende de outras unidades, mas poderia depender }
65+// uses SomeOtherUnit, YetAnotherUnit;
66+
67+{ público }
68+interface
69+
70+type
71+ { o tipo TRandomNumber torna-se acessível
72+ desde que a unidade seja incluida por meio da cláusula 'uses' }
73+ TRandomNumber = integer;
74+
75+{ outros blocos também podem ser incluídos, type, const, var, resourcestring }
76+
77+{ a assinatura de procedimentos e funções torna-os
78+ acessíveis desde que a unidade seja incluida por meio da cláulusa 'uses' }
79+function getRandomNumber(): TRandomNumber;
80+
81+{ um método não pode ser implementado na interface }
82+
83+{ privado }
84+implementation
85+
86+{ essa unidade não depende de outra unidade, mas poderia depender }
87+// uses SomeOtherUnit;
88+
89+{ variáveis acessíveis e modificaveis apenas nesta unidade }
90+var
91+ chosenRandomNumber: TRandomNumber;
92+
93+function getRandomNumber(): TRandomNumber;
94+begin
95+ Result := chosenRandomNumber;
96+end;
97+
98+{ ao início do programa }
99+initialization
100+begin
101+ chosenRandomNumber := 3;
102+end;
103+
104+{ ao final do programa }
105+finalization
106+begin
107+ WriteLn('bye');
108+end;
109+end.
110+```
111+
112+``` pascal
113+{
114+ Program
115+}
116+program chooseNextCandidate;
117+
118+{ usar unidade }
119+uses
120+ randomunit;
121+
122+begin
123+ WriteLn('Próximo Candidato:' + getRandomNumber());
124+end.
125+```
126+
127+Ao compilar, as dependências do programa serão conferidas. O compilador deve ser capaz de encontrar o arquivo "ramdomunit.pas" da unidade "randomunit". A maneira mais simples de assegurar isso é manter o nome do arquivo .pas idêntico ao nome da unidade, manter o arquivo na mesma pasta do arquivo do programa ou assegurar que o caminho do diretório do arquivo da unidade é conhecido pelo compilador (FPC).
128+
129+## Precedência de unidade
130+
131+Quando múltiplas unidades constam na cláusula 'uses' conflitos entre identificadores (procedures, types, functions, etc) com nomes idênticos podem ocorrer. Quando isso ocorre, "a última unidade ganha" e fornece o código.
132+
133+Se você quiser usar o código de uma unidade que "perdeu", você pode:
134+
135+1\) usar o nome da unidade como prefixo do identificador *unidade.identificador*; 2) reordenar as unidades;
136+
137+A primeira opção é a mais clara.
138+
139+## Veja também
140+
141+- [Unit scope](http://www.freepascal.org/docs-html/ref/refsu87.html) (FPC html doc)
142+- [Compiling a unit](http://www.freepascal.org/docs-html/user/userse11.html) (FPC html doc)
143+
144+---
145+*From the Free Pascal wiki, page "Unit/pt", as it stood on 2020-03-02 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history