Unit/pt: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Unit/pt
| Old | New | Line | |
|---|---|---|---|
| 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).* |
