Objeto de valor por Martin Fowler

 


Ao programar, muitas vezes acho útil representar coisas como compostos. Uma coordenada 2D consiste em um valor x e um valor y. Uma quantia de dinheiro consiste em um número e uma moeda. Uma faixa de datas consiste em datas de início e fim, que por sua vez podem ser compostos de ano, mês e dia.

Ao fazer isso, encontro a questão de se dois objetos compostos são os mesmos. Se eu tiver dois objetos de ponto que representam as coordenadas cartesianas de (2,3), faz sentido tratá-los como iguais. Objetos que são iguais por causa do valor de suas propriedades, neste caso suas coordenadas x e y, são chamados de objetos de valor.

No entanto, a menos que eu seja cuidadoso ao programar, eu pode não obter esse comportamento nos meus programas.

Digamos que eu quero representar um ponto em JavaScript.

const p1 = {x: 2, y: 3};
const p2 = {x: 2, y: 3};
assert(p1 !== p2);  // não é que eu quero "Não é o que quero"


Infelizmente, esse teste passa. Isso acontece porque o JavaScript testa a igualdade para objetos JS 
olhando para suas referências, ignorando os valores que eles contêm.

Em muitas situações, faz sentido usar referências em vez de valores. Se eu estiver carregando e manipulando
um monte de pedidos de vendas, faz sentido carregar cada pedido em um único lugar. Se eu precisar veri
ficar se o último pedido da Alice está na próxima entrega, posso pegar a referência de memória, ou identidade, 
do pedido da Alice e verificar se essa referência está na lista de pedidos na entrega. 

Para esse teste, não preciso me preocupar com o que está no pedido. 
Da mesma forma, eu poderia confiar em um número de pedido único,
 testando para ver se o número do pedido da Alice está na lista de entregas.

Portanto, acho útil pensar em duas classes de objetos: objetos de valor e objetos de referência, 
dependendo de como os distingo. Preciso garantir que saiba como espero que cada 
objeto lide com a igualdade e programá-los para que se comportem de acordo com minhas expectativas. Como faço isso depende da linguagem de programação com a qual estou trabalhando.

Algumas linguagens tratam todos os dados compostos como valores. Se eu fizer um composto simples em Clojure, fica assim.

Criação de comitê de Tecnologia da informação, exemplar




A criação de um comitê de Tecnologia da Informação (TI) para um município no Paraná, como o município X, deve seguir as regras do TCE (Tribunal de Contas do Estado do Paraná). Aqui estão os passos que você pode seguir:

Identificação dos membros do comitê: O primeiro passo é identificar os membros do comitê. Eles devem ser pessoas com conhecimento e experiência em tecnologia da informação. Isso pode incluir funcionários do município, contratados, ou até mesmo membros da comunidade.

Definição dos objetivos do comitê: O comitê deve ter objetivos claros. Isso pode incluir a implementação de novas tecnologias, a melhoria da infraestrutura tecnológica existente, ou a implementação de políticas e procedimentos para a gestão eficiente da tecnologia da informação.

Desenvolvimento de um plano de ação: Com base nos objetivos do comitê, deve ser desenvolvido um plano de ação. Este plano deve detalhar as ações que o comitê irá tomar para alcançar seus objetivos.

Implementação do plano de ação: O comitê deve então implementar o plano de ação. Isso pode incluir a contratação de novos serviços, a implementação de novas tecnologias, ou a alteração de políticas e procedimentos existentes.

Avaliação do desempenho do comitê: Após a implementação do plano de ação, o comitê deve avaliar seu desempenho. Isso pode incluir a avaliação de quão bem o plano de ação foi implementado, e quão bem ele está ajudando o município a atingir seus objetivos.

Relatórios e transparência: O comitê deve ser transparente em suas ações e resultados. Isso pode incluir a produção de relatórios regulares sobre o progresso do comitê, e a divulgação de informações sobre as ações e resultados do comitê.

Determinando se um tópico de pesquisa é de seu interesse

Para determinar se um tópico de pesquisa é de seu interesse, você pode seguir as seguintes etapas:


1. Curiosidade: O tópico de pesquisa deve despertar sua curiosidade. Isso significa que você deve estar interessado em aprender mais sobre o tópico e em entender melhor como ele funciona (https://pt.wikihow.com/Escolher-um-T%C3%B3pico-de-Pesquisa).


2. Relevância: O tópico de pesquisa deve ser relevante para o seu campo de estudo ou área de interesse. Isso significa que o tópico deve estar relacionado ao que você já sabe e o que você gostaria de aprender mais(https://humanidades.com/br/projeto-de-pesquisa/).


3. Acessibilidade: O tópico de pesquisa deve ser acessível. Isso significa que você deve ser capaz de encontrar informações suficientes sobre o tópico para realizar sua pesquisa. Se o tópico for muito amplo ou muito específico, pode ser difícil encontrar informações suficientes (https://pt.wikihow.com/Escolher-um-T%C3%B3pico-de-Pesquisa).


4. Desafio: O tópico de pesquisa deve ser um desafio. Isso significa que o tópico deve ter algum aspecto que você ainda não entende completamente, ou algum aspecto que ainda é objeto de debate entre os especialistas. Se o tópico for muito conhecido e não houver muitos debates ou desacordos, pode não ser tão interessante(https://www.springer.com/br/authors-editors/authorandreviewertutorials/writing-a-journal-manuscript/identifying-you-research-question/12011928).


5.Motivação: O tópico de pesquisa deve ser algo que você esteja motivado a explorar. Isso significa que você deve estar emocionado ou ansioso para começar a pesquisa. Se você não está emocionado ou ansioso, pode ser difícil manter a motivação durante o processo de pesquisa (https://pt.wikihow.com/Escolher-um-T%C3%B3pico-de-Pesquisa).


6. Possibilidade de contribuição: O tópico de pesquisa deve ser algo que você possa contribuir. Isso significa que o tópico deve ter algum aspecto que ainda não tenha sido totalmente explorado ou que ainda não tenha sido completamente resolvido. Se o tópico já foi completamente explorado ou resolvido, pode não ser tão interessante (https://www.questionpro.com/blog/pt-br/problema-de-pesquisa/).


Lembre-se, a escolha do tópico de pesquisa é uma parte crucial do processo de pesquisa. Portanto, é importante que você escolha um tópico que seja de seu interesse e que seja suficientemente específico para ser pesquisado.

Evolução dos dispositivos digitais

 

A evolução dos dispositivos digitais trouxe um amplo conjunto de funções que, muitas vezes, não estão diretamente relacionadas entre si. Isso apresenta desafios significativos para os engenheiros, que devem descrever o contexto detalhado no qual as funções serão fornecidas e identificar as interações potencialmente perigosas entre diferentes características do sistema. 

A primeira etapa para enfrentar esse desafio é entender o contexto em que as funções serão fornecidas. Isso envolve a análise das necessidades do usuário e a identificação de como as diferentes funções do sistema podem ser utilizadas para atender a essas necessidades. Isso pode envolver a análise de como as diferentes funções do sistema podem ser integradas e como elas podem interagir umas com as outras. (Referência).

A segunda etapa é identificar as interações potencialmente perigosas entre diferentes características do sistema. Isso envolve a análise de como diferentes funções do sistema podem interagir umas com as outras e identificar possíveis problemas que podem surgir dessas interações. Isso pode envolver a análise de como diferentes funções do sistema podem ser manipuladas para obter resultados indesejados e a identificação de medidas que podem ser tomadas para prevenir esses problemas (Referência).

Por exemplo, se um sistema tem uma função de câmera e uma função de microfone, é possível que essas funções possam ser manipuladas para obter informações pessoais sem o consentimento do usuário. Portanto, é importante que os engenheiros identifiquem essas possíveis interações perigosas e tomem medidas para prevenir esse tipo de problema.

Finalmente, é importante que os engenheiros mantenham-se atualizados com as últimas pesquisas e desenvolvimentos em tecnologia digital. Isso pode envolver a participação em conferências e workshops, a leitura de artigos e livros sobre o assunto e a participação em grupos de discussão online. Isso pode ajudar a garantir que eles estejam cientes das últimas tendências e desenvolvimentos e que possam utilizar essas informações para melhorar o design e a segurança de seus sistemas.(Referência).

Como é feito pipeline de implantação em código php , utilizando como um exemplo básico.

 

Um pipeline de implantação (deployment pipeline) é um processo que gerencia o fluxo de mudanças que passam por vários estágios de desenvolvimento até a produção. Aqui está um exemplo básico de como você pode configurar um pipeline de implantação para um projeto PHP usando Git e um servidor de integração contínua como Jenkins.

  1. Repositório Git: Primeiro, você precisa ter seu código PHP em um repositório Git. Cada vez que você faz uma alteração no código, você faz um commit e push para o repositório.
git add .
git commit -m "Sua mensagem de commit"
git push origin master
  1. Servidor de Integração Contínua (CI): Você pode usar um servidor de CI como Jenkins para automatizar o processo de teste e implantação. No Jenkins, você pode configurar um trabalho para buscar o código do repositório Git sempre que houver uma nova alteração.

  2. Testes: Antes de implantar o código, você deve executar testes para garantir que tudo esteja funcionando corretamente. Você pode usar uma ferramenta de teste PHP como PHPUnit para isso.

     phpunit --configuration phpunit.xml
  1. Implantação: Se todos os testes passarem, o código pode ser implantado no ambiente de produção. Isso pode ser feito usando uma ferramenta de implantação como Deployer.
     dep deploy production

Veja  um exemplo básico. Um pipeline de implantação real pode envolver muitos outros estágios e ferramentas, dependendo das necessidades do seu projeto. Além disso, é importante garantir que seu pipeline de implantação seja configurado para lidar com falhas de maneira adequada, para evitar a implantação de código quebrado em produção.



Refatoração

 

O que é e como pode ser code "smell"?



Código pode "cheirar" porque indica potenciais problemas que podem levar a bugs, dificuldades de manutenção ou outros problemas. Os code smells são sinais de que o código pode não estar bem projetado ou implementado.

Alguns exemplos de code smells incluem:

  • Codigo duplicado: Código que é repetido em diferentes partes do programa. Isso pode dificultar a manutenção e aumentar o risco de bugs.
  • Codigo acoplado: Código que depende excessivamente de outros pedaços de código. Isso pode dificultar a mudança e a manutenção.
  • Codigo complexo: Código que é difícil de entender ou manter. Isso pode levar a erros e dificultar a evolução do programa.
  • A refatoração é o processo de melhorar o código sem alterar seu comportamento externo. Ela pode ser usada para corrigir code smells e melhorar a qualidade do código.

Aqui estão alguns exemplos de como a refatoração pode ser usada para corrigir code smells:

  • Codigo duplicado: O código duplicado pode ser combinado em uma única função ou classe.
  • Codigo acoplado: O código acoplado pode ser refatorado para usar interfaces ou abstrações.
  • Codigo complexo: O código complexo pode ser dividido em partes menores e mais fáceis de entender.

A refatoração é uma ferramenta importante para melhorar a qualidade do código. Ela pode ajudar a evitar bugs, facilitar a manutenção e melhorar a produtividade.


Em português, um code smell pode ser traduzido como "mau cheiro de código". O termo é usado para descrever código que pode indicar problemas.

Princípios de design e padrões de design com Robert Martins

 

O que é arquitetura de software? 

Segundo Robert C. Matins diz ,na  resposta que é multifacetada. 

No nível mais alto, existem os padrões de arquitetura que definem a forma e a estrutura gerais das aplicações de software [1]. 

Um nível abaixo está a arquitetura que está especificamente relacionada ao propósito da aplicação de software. 

Mais um nível abaixo reside a arquitetura dos módulos e suas interconexões. Este é o domínio dos padrões de design [2], pacotes, componentes e classes. 

É com este nível que nos preocuparemos neste artigo.

Nosso escopo neste capítulo é bastante limitado. Há muito mais a ser dito sobre os princípios e padrões que são expostos aqui. Os leitores interessados são encaminhados para [Martin99].

====================

Pelo meu entendimento que a arquitetura de software é de fato um assunto multifacetado e possui diferentes níveis de definição. No nível mais alto, temos os padrões de arquitetura que estabelecem a forma e a estrutura geral das aplicações de software. Estes padrões fornecem diretrizes abrangentes para a organização e interação dos componentes de um sistema.

Logo abaixo, temos a arquitetura específica da aplicação de software. Essa arquitetura está relacionada diretamente com o propósito e os requisitos da aplicação em questão. Ela define como os diferentes módulos e componentes se encaixam para cumprir os objetivos da aplicação.

Em um nível mais detalhado, encontramos a arquitetura dos módulos individuais e suas interconexões. Nesse nível, entram em jogo padrões de design, pacotes, componentes e classes. Esses elementos fornecem diretrizes mais específicas sobre a estrutura interna dos componentes de software, como eles se relacionam entre si e como podem ser reutilizados em diferentes contextos.

Neste artigo, focaremos principalmente nesse nível da arquitetura de software, explorando padrões de design, pacotes, componentes e classes em suas interconexões dentro de um sistema.

Objeto de valor por Martin Fowler

  Ao programar, muitas vezes acho útil representar coisas como compostos. Uma coordenada 2D consiste em um valor x e um valor y. Uma quantia...