Jump to content

Marcel Blasque Ribeiro

Pessoal da TecnoSpeed
  • Contagem de Conteúdo

    5
  • Ingressou

  • Última visita

  • Dias Ganhos

    3

Marcel Blasque Ribeiro ganhou o dia em Dezembro 29 2023

Marcel Blasque Ribeiro teve o conteúdo mais curtido!

Informações Pessoais

  • Cidade
    maringá
  • Estado
    Paraná (PR)

Clientes & Parceiros

  • Você é um cliente TecnoSpeed?
    Não
  • Você é um parceiro da Casa do Desenvolvedor?
    Não

Visitantes Recentes do Perfil

O bloco de visitantes recentes está desativado e não está sendo mostrado a outros usuários.

Conquistas de Marcel Blasque Ribeiro

  • Positividade Raro

Emblemas Recentes

8

Reputação na Comunidade

  1. Olá Dev, seja bem-vindo! Vamos aprender sobre Expect no Jest A função expect no Jest é utilizada sempre que você deseja testar um valor. Aqui está uma visão geral: expect(valor): Esta é a função principal usada para criar uma “expectativa” sobre um certo valor nos seus testes. Modificadores: .not, .resolves, .rejects podem inverter os matchers ou lidar com promessas. Matchers: Funções como .toBe(valor), .toEqual(valor), .toContain(item) são usadas para afirmar algo sobre o valor. Você raramente usará expect sozinho. Em vez disso, você usará expect com uma função “matcher” para afirmar algo sobre um valor. Por exemplo, se você tem um método melhorSabor() que espera retornar a string ‘morango’, você poderia testar assim: test('o melhor sabor é morango', () => { expect(melhorSabor()).toBe('morango'); }); Neste caso, toBe é a função “matcher”. Existem muitas funções “matcher” diferentes para ajudá-lo a testar coisas diferentes. O argumento para expect deve ser o valor que seu código produz, e qualquer argumento para o matcher deve ser o valor correto esperado. Para mais informações, você pode consultar a documentação do Jest Em nosso dia a dia, podemos nos deparar com situações em que apenas os matcher pré-definidos pelo Jest não são suficientes, o que gera muitas vezes duplicidade de código e agrega complexidade desnecessária nos testes. Para contornar essa situação, você pode usar expect.extend e adicionar seus próprios "matchers" no Jest. Por exemplo, vamos utilizar nosso exemplo acima criando nossa própria validação: vamos criar na raiz do nosso projeto um arquivo js para centralizar nossos matchers personalizados Para uma organização coesa do projeto, criei a pasta utils. Dentro desta pasta, encontra-se o arquivo dedicado à implementação dos matchers. Aqui está uma dica para incluir nossa implementação globalmente no Jest e evitar a necessidade de importar sempre o nosso arquivo jest.extends.js. Em package.json vamos adicionar o código abaixo: "jest": { "setupFilesAfterEnv": [ "./utils/jest.extends.js" ] } Para mais informações, você pode consultar Configuring Jest agora vamos criar nosso matcher em jest.extends.js expect. extend({ async isMatch(received, valorEsperado, errorMessage) { if (await received.match(valorEsperado)) { return { pass: true }; } else { return { message: () => errorMessage, pass: false, }; }; } }); utilizando nosso matcher test('o melhor sabor é morango', () => { await expect('banana').isMatch('morango', 'Esse não é o melhor sabor'); }); Análise do código Criamos nosso matcher isMatch que recebe três parâmetros: o primeiro é o valor que será avaliado, o segundo é o valor esperado para a comparação, e o terceiro é uma mensagem de erro que será exibida se a validação não for bem-sucedida. Para criar um novo matcher: expect. extend({ async isMatch(received, valorEsperado, errorMessage) { if (await received.match(valorEsperado)) { return { pass: true }; } else { return { message: () => errorMessage, pass: false, }; }; }, async isFalse(received, errorMessage) { if (received) { return { pass: false }; } else { return { message: () => errorMessage, pass: true, }; }; } });
  2. Olá Dev, seja bem-vindo! Namespace A partir do Delphi 2007~2009, a Embarcadero introduziu o conceito de Namespaces, permitindo o uso de nomes de unidades com ponto, semelhante ao que já existe em algumas outras linguagens. Exemplo: unit Unit1; interface uses System.SysUtils, System.Classes; //declaração utilizando"namespace" type TForm1 = class(TForm) // ... Seus componentes e código de formulário aqui end; implementation {$R *.dfm} // ... Seu código de implementação aqui end. A maioria dos programadores utiliza a seguinte abordagem para compilar esse mesmo código em versões anteriores do Delphi: uses {$IFDEF VER...} System.SysUtils, System.Classes; //como "Namespaces" {$ELSE} SysUtils // sem "Namespaces" {$ENDIF} Quem ai, já teve a necessidade de incluir várias diretivas de compilação, os conhecidos $IFDEFS, para compilar o mesmo projeto em diferentes versões do Delphi? Saiba que há uma maneira mais simples para realizar essa tarefa. Para solucionar este problema e compatibilizar as declarações sem a necessidade de uma diretiva de compilação, pode-se adicionar um aliase em: Project->Options->Delphi Compiler -> Unit aliases: Onde vamos adicionar aliases para as unidades utilizando a seguinte sintaxe.: apelido=namespace.unitname Essa modificação permitirá remover todas as diretivas de compilação da seção "uses", deixando essa configuração definida em nosso projeto. Obrigado, Dev, que sua jornada no mundo do desenvolvimento seja repleta de descobertas e conquistas extraordinárias!
  3. Olá Dev, seja bem-vindo! Antes de nos aventurarmos no código, é fundamental dominarmos alguns conceitos básicos. O que são modificadores de acesso? Em programação orientada a objetos, os modificadores de acesso são palavras-chave utilizadas para controlar a visibilidade e acessibilidade de variáveis, métodos e classes em um programa. Eles determinam quais partes do código podem acessar e modificar determinados elementos. Existem geralmente três tipos de modificadores de acesso: Public: Elementos marcados como public são acessíveis de qualquer lugar do programa, ou seja, podem ser utilizados por outras classes, objetos ou partes do código sem restrições. Protected: O modificador protected permite que os elementos sejam acessados pelas classes derivadas (subclasses) dentro da mesma hierarquia de classes (herança), mas não por classes fora dessa hierarquia. Private: Elementos marcados como private são acessíveis apenas dentro da própria classe onde foram declarados. Eles não podem ser acessados por classes externas, nem mesmo por subclasses. A utilização desses modificadores é essencial para garantir a encapsulação e a segurança do código, controlando quais partes do programa podem interagir com determinados elementos e evitando acesso não autorizado ou modificações indevidas. Aqui está um exemplo simples de como declarar uma classe no Delphi: TPessoa = class private FNome: string; procedure SetNome(const Value: string); published public property Nome: string read FNome Write FNome; end; Classes amigas No Delphi, podemos declarar várias classes na mesma unit: unit Unit1; interface type TPessoa = class private FNome: string; procedure SetNome(const Value: string); public property Nome: string read FNome Write SetNome; end; TPassaro = class private FCor: string; procedure SetCor(const Value: string); public property Cor: string read FCor Write SetCor; end; implementation { TPessoa } procedure TPessoa.SetNome(const Value: string); begin FNome := Value; end; { TPassaro } procedure TPassaro.SetCor(const Value: string); begin FCor := Value; end; end. Os modificadores de acesso (public, protected e private) definem a visibilidade dos membros de uma classe. Membros declarados como private só são acessíveis dentro da própria classe, enquanto membros protected podem ser acessados por classes descendentes (herança). No entanto, no exemplo acima, há uma pequena exceção em relação ao escopo de visibilidade "private". Podemos observar essa exceção, na qual ambas as classes podem acessar diretamente os atributos da outra classe, contornando o encapsulamento. Isso resulta no termo "classes amigas", pois, mesmo sendo privados, elas têm acesso aos atributos e métodos uma da outra. Como resolver esse problema declarando as classes na mesma unit? A partir de Delphi 2006, a diretiva strict private foi introduzida no Delphi para restringir ainda mais o acesso, permitindo que somente a própria classe acesse esses membros. Exemplo utilizando strict private: unit Unit1; interface type TPessoa = class strict private FNome: string; procedure SetNome(const Value: string); public property Nome: string read FNome Write SetNome; end; TPassaro = class strict private FCor: string; procedure SetCor(const Value: string); public property Cor: string read FCor Write SetCor; end; implementation { TPessoa } procedure TPessoa.SetNome(const Value: string); begin FNome := Value; end; { TPassaro } procedure TPassaro.SetCor(const Value: string); begin FCor := Value; end; end. publisher No Delphi, o modificador published é usado para definir a visibilidade de membros de uma classe que podem ser acessados não apenas dentro da própria classe ou por suas subclasses, mas também por formulários e componentes visuais durante o design de interfaces de usuário. Quando um membro de uma classe é marcado como published, ele se torna visível no designer de formulários do Delphi, permitindo que propriedades, métodos ou eventos sejam configurados e manipulados visualmente através da IDE (Ambiente Integrado de Desenvolvimento) do Delphi, como o Delphi RAD Studio. Isso é especialmente útil ao criar aplicativos com interface gráfica ou componentes, pois permite a interação fácil e direta com os componentes visuais, configurando propriedades e eventos diretamente na interface gráfica do Delphi. Por exemplo, ao marcar uma propriedade como published em uma classe que herda de um componente visual (como um TButton ou TEdit), essa propriedade se torna visível no Object Inspector (Inspetor de Objetos) do Delphi, onde você pode configurar suas propriedades, associar eventos, etc., simplificando o desenvolvimento de interfaces de usuário. type TExemplo = class(TComponent) private FNome: string; published property Nome: string read FNome write FNome; end; Neste exemplo, a propriedade Nome foi declarada como published, o que permitiria a manipulação dela dentro do designer do Delphi, facilitando sua utilização e configuração na interface gráfica. Obrigado, Dev, que sua jornada no mundo do desenvolvimento seja repleta de descobertas e conquistas extraordinárias!
  4. Configurar variáveis de ambiente é uma tarefa comum na programação, pois permite que você defina valores que podem ser acessados por seus programas ou sistemas operacionais. As variáveis de ambiente são úteis para armazenar informações como caminhos de diretórios, credenciais, configurações específicas do aplicativo e muito mais. A forma de configurar variáveis de ambiente varia conforme o sistema operacional que você está usando. No Windows podemos configurar seguindo os passos abaixo: Usando o Painel de Controle: Abra o "Painel de Controle". Vá para "Sistema e Segurança" > "Sistema". No painel esquerdo, clique em "Configurações avançadas do sistema". Na guia "Avançado", clique no botão "Variáveis de ambiente". Você verá duas seções: "Variáveis de usuário" e "Variáveis do sistema". Para adicionar uma nova variável de ambiente, clique em "Novo" em uma das seções, insira o nome e o valor da variável e clique em "OK". Em aplicações Delphi, é possível utilizar as variáveis de ambiente do sistema para padronizar a saída dos executáveis e DCUs, além de determinar o caminho dos arquivos utilizados no projeto. Exemplo: Nesse exemplo utilizarei os arquivos da pasta fontes no projeto Delphi No Windows vamos criar a variável de ambiente tecnospeed que representará o caminho da instalação do componente GNRe No projeto Delphi vamos acessar: project > options > Delphi Compiler e procure pela opções Search Patch, aonde vamos informar nossa variável com a sintaxe: $(nome_da_variavel) OBS.: essa etapa pode mudar para versões diferentes do Delphi, nesse caso utilizo a XE3 Dessa forma, podemos alterar os diretórios de nossos projetos configurando as variáveis do Windows sem a necessidade de alterar o código. Podemos utilizar a mesma abordagem para padronizar a saída dos executáveis e das DCUs;
  5. O que são interfaces? Uma interface Delphi define um conjunto de métodos e propriedades que um objeto pode implementar, permitindo que outros objetos se comuniquem com ele de forma independente da classe ou hierarquia de herança. Isso oferece maior flexibilidade e escalabilidade ao projeto de software, pois permite que os objetos sejam facilmente substituídos por outros objetos que implementam a mesma interface. Além disso, as interfaces também ajudam a reduzir a dependência de tipos e aumentar a coesão do código. Em Delphi, as interfaces são definidas usando a palavra-chave "interface" e podem ser implementadas por qualquer classe que queira oferecer funcionalidade para outras classes ou componentes. As interfaces também podem ser herdadas de outras interfaces, permitindo a criação de hierarquias de interfaces para modelar relacionamentos entre objetos e componentes. Aqui está um exemplo simples de como declarar uma interface no Delphi: type IExemplo = interface procedure Foo; end; Chega de teoria e bora para o exemplo! No Delphi vamos criar uma nova aplicação VCL Em seguida crie uma nova Unit Nessa Unit vamos colar o código abaixo: unit Unit1; interface type iExemplo = interface ['{04AD028A-AFA9-45DD-B257-1EFB80378B8C}'] // CTRL + SHIFT + G para gerar a chave da interface procedure Foo; end; TExemplo = class public procedure Foo; end; implementation { TExemplo } procedure TExemplo.Foo; begin // código para implementar o método "Foo" end; end. No Form principal adicione um botão e duplo click nele! Adicione o código abaixo no evento click do botão e de uses na Unit1 procedure TForm4.btn1Click(Sender: TObject); var exemplo : TExemplo; begin exemplo := TExemplo.Create; ShowMessage('objeto exemplo criado!'); end; Botão direito do mouse e selecione View Source Adicione a linha abaixo para habilitar a exibição dos, vazamento de memória: ReportMemoryLeaksOnShutdown := True; Agora execute a aplicação, click no botão e finalize a mesma E temos a mensagem abaixo, indicando que TExemplo foi criado, porém, não foi liberado da memória E como resolver isso? Vamos utilizar interfaces! Refatorando a classe Exemplo: unit Unit1; interface type iExemplo = interface ['{04AD028A-AFA9-45DD-B257-1EFB80378B8C}'] procedure Foo; end; TExemplo = class(TInterfacedObject, iExemplo) public procedure Foo; end; implementation { TExemplo } procedure TExemplo.Foo; begin // código para implementar o método "Foo" end; end. Note que agora TExemplo herda de TInterfacedObject e implementa iExemplo Na Unit pricipal vamos mudar o tipo da variável exemplo para iExemplo: procedure TForm4.btn1Click(Sender: TObject); var exemplo : iExemplo; // alterado para iExemplo begin exemplo := TExemplo.Create; ShowMessage('objeto exemplo criado!'); end; Agora execute a aplicação novamente e a nossa mensagem de vazamento de memória não será exibida! Oloco meu! Como o Delphi fez isso? Ao herdar de TInterfacedObject, a classe TExemplo já tem a implementação padrão dos métodos "AddRef", "Release" e "QueryInterface", que são necessários para que a interface funcione corretamente. É importante lembrar que, ao usar TInterfacedObject, seu objeto será gerenciado automaticamente pelo mecanismo de referência contada do Delphi. Isso significa que o objeto será automaticamente liberado da memória quando não houver mais referências a ele, o que pode simplificar o gerenciamento de memória em seus projetos.
×
×
  • Create New...