O aprimoramento do autocompletamento de código corporativo utiliza os repositórios de código carregados pela sua empresa como contexto para o autocompletamento de código inline durante a geração de código. Assim, as sugestões ficam mais alinhadas aos padrões de codificação e às características de negócio da empresa. Este tópico descreve como construir um repositório de código corporativo de alta qualidade e compartilha melhores práticas para cenários de desenvolvimento frontend e backend.
O novo site de documentação do Qoder CN já está disponível. O conteúdo neste site pode não refletir os recursos e alterações mais recentes do produto. Acesse docs.qoder.cn para obter a documentação mais recente do produto.
Edições e idiomas suportados
|
Edição |
Backend |
Frontend |
|
Enterprise Standard Edition |
Java, C#, C/C++, Go, Python |
JavaScript, TypeScript, Vue, React |
|
Enterprise Dedicated Edition |
Java, C#, C/C++, Go, Python |
JavaScript, TypeScript, Vue, React |
|
Edição |
Backend |
Frontend |
|
Enterprise Dedicated Edition |
Java, C#, C/C++, Go, Python |
JavaScript, TypeScript, Vue, React |
Como administradores preparam um repositório de código corporativo de alta qualidade
Para garantir que seus dados de código sejam processados de forma eficaz, siga estas diretrizes ao preparar repositórios de código. Isso melhora a eficiência e a precisão da recuperação.
Diretrizes para selecionar e preparar repositórios de código
As seções a seguir descrevem como preparar repositórios de código em dois cenários diferentes:
Cenário 1: Desenvolvimento diário de engenharia — melhore a eficiência de P&D. No desenvolvimento corporativo, utilize múltiplos repositórios de código para dar suporte à ampliação da recuperação, o que melhora a reutilização de código e a eficiência do desenvolvimento. Veja a seguir as principais formas de selecionar repositórios de código:
Preparação do repositório de código para cenários de backend
[Recomendado] Selecione trechos ou arquivos de código de alta frequência: Selecione trechos de código que aparecem com frequência ou são reutilizados diversas vezes nos projetos atuais. Esses trechos são frequentemente referenciados e reutilizados, o que os torna adequados como conteúdo da base de conhecimento. Organize os trechos ou arquivos de código qualificados de um projeto em um repositório independente e carregue-os em uma base de conhecimento separada para facilitar o gerenciamento e a invocação.
Código do projeto atual: Coloque também o projeto atual inteiro na base de conhecimento para permitir a recuperação abrangente em toda a base de código. Assim, você melhora a reutilização de código e a eficiência do desenvolvimento. No entanto, código interferente ou grandes quantidades de código de baixa qualidade no projeto enfraquece o efeito do aprimoramento do autocompletamento de código.
Preparação do repositório de código para cenários de frontend
Carregue o repositório de código que utiliza uma biblioteca de componentes, em vez do repositório de código-fonte dos componentes. Cubra o máximo de cenários de uso possível.
[Recomendado] Repositório de código de páginas de modelo frontend: Monte os componentes personalizados da sua empresa para empacotar páginas frontend altamente reutilizáveis e relevantes para o negócio em modelos. Essas páginas de modelo representam os casos de prática de mais alta qualidade, como páginas de login, páginas de registro, exibições de conta e transferências de fundos. Se sua empresa já possui uma biblioteca de modelos desse tipo, carregue-a primeiro na base de conhecimento de código corporativo.
Repositório de código do projeto atual: O repositório de código do projeto atual contém o código mais relevante para as tarefas de desenvolvimento atuais. Carregar código de projeto bem escrito, com estrutura clara e boas práticas na base de conhecimento de código corporativo permite a recuperação abrangente em toda a base de código. Isso melhora a reutilização de código e a eficiência do desenvolvimento. Código interferente ou grandes quantidades de código de baixa qualidade no projeto atual enfraquece o efeito do aprimoramento do autocompletamento de código.
Cenário 2: Cenários de negócio específicos — garanta a consistência do código e reduza o desenvolvimento repetido. No desenvolvimento de aplicações corporativas, algumas lógicas de negócio devem se manter consistentes para garantir a estabilidade e a manutenibilidade do sistema. Sem padrões unificados, diferentes desenvolvedores podem adotar implementações diferentes. Isso leva a lógica de negócio inconsistente, manutenção de código mais complexa e potenciais problemas de estabilidade do sistema.
Caso 1: Reutilização de lógica de frameworks e middleware corporativos
Uma empresa necessita de um mecanismo de lock distribuído unificado para o gerenciamento de estoque em seu sistema de venda de mercadorias. Ao integrar seu framework de negócio autodesenvolvido na base de conhecimento de código, os desenvolvedores podem facilmente recuperar e reutilizar esses trechos de código padronizados. Isso acontece quando escrevem lógica de negócio relacionada no ambiente de desenvolvimento integrado (IDE). Isso melhora a eficiência do desenvolvimento, reduz o desenvolvimento repetido, aprimora a qualidade do código e garante a consistência da lógica de negócio.
Seleção e preparação do repositório de código:
Esclareça os padrões de negócio alvo e os mecanismos de implementação específicos:
Identifique os módulos de negócio principais: Determine os módulos de lógica de negócio essenciais no sistema que exigem uma implementação unificada, como gerenciamento de estoque, processamento de pedidos e sistemas de pagamento.
Refine os mecanismos de implementação de operações de negócio específicas: Por exemplo, o gerenciamento de estoque pode envolver diferentes cenários, como dedução de estoque, consulta de estoque e bloqueio de estoque. Cada cenário pode exigir um mecanismo de implementação diferente.
Selecione arquivos de código do framework de negócio relevante e coloque-os na base de conhecimento de código corporativo:
Filtre o código principal que implementa a lógica de negócio essencial do framework de negócio. Em seguida, organize-o e coloque-o em uma base de conhecimento de código independente. Por exemplo, a dedução de estoque requer um mecanismo de lock distribuído para garantir a segurança de concorrência, portanto, selecione o módulo de código principal que implementa o lock distribuído.
/**
* Use the enterprise-developed distributed lock framework for concurrency control
*/
@Service
public class InventoryService {
@Autowired
private DistributedLockFramework lockFramework;
@Autowired
private InventoryRepository inventoryRepository;
/**
* Deduct inventory. Use a distributed lock to ensure concurrency safety.
* @param productId The product ID.
* @param quantity The quantity to deduct.
* @return Whether the deduction is successful.
*/
public boolean deductInventory(Long productId, int quantity) {
String lockKey = "inventory:" + productId;
return lockFramework.withLock(lockKey, 30, TimeUnit.SECONDS, () -> {
Inventory inventory = inventoryRepository.findByProductId(productId);
if (inventory == null || inventory.getQuantity() < quantity) {
return false;
}
inventory.setQuantity(inventory.getQuantity() - quantity);
inventoryRepository.save(inventory);
return true;
});
}
}
Caso 2: Reutilização de lógica de negócio corporativa essencial
Uma empresa deseja estabelecer uma estratégia de recomendação personalizada unificada para seu sistema de recomendação de mercadorias. Ao integrar sua arquitetura de negócio autodesenvolvida na base de conhecimento de código, os desenvolvedores podem facilmente acessar e reutilizar esses módulos de código padronizados. Isso acontece quando escrevem funcionalidades relacionadas no ambiente de desenvolvimento integrado (IDE). Isso acelera o desenvolvimento de software e evita retrabalho desnecessário. Além disso, melhora a qualidade geral do código e garante a consistência e a estabilidade da lógica de negócio em todo o sistema.
Seleção e preparação do repositório de código:
Esclareça os módulos de negócio alvo e os comportamentos específicos:
Identifique os módulos de negócio principais: Primeiro determine quais módulos de lógica de negócio essenciais no sistema exigem uma implementação unificada, como o sistema de recomendação de mercadorias.
Refine os comportamentos específicos: Em seguida, defina os comportamentos de negócio específicos e as etapas de operação principais. Por exemplo, uma estratégia de recomendação personalizada pode incluir as seguintes etapas principais: obter dados de comportamento do usuário, extrair características de interesse do usuário e obter o pool de mercadorias candidatas. Depois, pontue e classifique as mercadorias e retorne as de maior pontuação. Essas etapas são implementadas por meio de combinações fixas de código.
Selecione arquivos de código do framework de negócio relevante e coloque-os na base de conhecimento de código corporativo:
Selecione o código principal que implementa a lógica de negócio essencial do framework de negócio. Em seguida, organize-o e armazene-o em uma base de conhecimento de código independente. O exemplo a seguir mostra o mecanismo de recomendação personalizada de um sistema de recomendação:
/**
* Recommendation engine service
* Implements a personalized recommendation mechanism based on user behavior and commodity features
*/
@Service
public class RecommendationService {
@Autowired
private UserBehaviorRepository userBehaviorRepo;
@Autowired
private ProductRepository productRepo;
/**
* Generate a personalized recommendation list for a specified user
* @param userId The user ID.
* @param limit The number of recommendations.
* @return The list of recommended commodity IDs.
*/
public List<Long> generateRecommendations(Long userId, int limit) {
// Obtain user behavior data
List<UserBehavior> behaviors = userBehaviorRepo.findRecentByUserId(userId, 100);
// Extract user interest features
Map<String, Double> userInterests = extractUserInterests(behaviors);
// Obtain the candidate commodity pool
List<Product> candidateProducts = productRepo.findRecentlyActive(1000);
// Score and rank commodities
List<ScoredProduct> scoredProducts = candidateProducts.stream()
.map(product -> new ScoredProduct(product, calculateScore(product, userInterests)))
.sorted(Comparator.comparing(ScoredProduct::getScore).reversed())
.collect(Collectors.toList());
// Return the highest-scoring commodities
return scoredProducts.stream()
.limit(limit)
.map(sp -> sp.getProduct().getId())
.collect(Collectors.toList());
}
// Other auxiliary methods...
}
Adicione comentários apropriados ao código dos módulos de negócio alvo extraídos. Assim, os desenvolvedores poderão recuperar trechos de código convenientemente por meio de comentários inline no IDE.
Caso 3: Referência a projetos antigos para melhorar a eficiência de P&D de novos projetos
Quando uma empresa desenvolve um novo projeto, a reutilização do código de módulos principais semelhantes de projetos antigos melhora a eficiência do desenvolvimento. Isso também reduz o tempo e o custo de escrever todo o código do zero, tornando a qualidade do novo projeto mais confiável.
Seleção e preparação do repositório de código:
Esclareça o negócio alvo e os cenários, e identifique os módulos de negócio principais:
Determine funções semelhantes: Primeiro identifique as funções e partes de implementação semelhantes entre o projeto antigo e o novo projeto. Por exemplo, se ambos os projetos envolvem gerenciamento de usuários, exibição de mercadorias e processamento de pedidos, esses módulos podem ser o foco.
Avalie a qualidade do código: Certifique-se de que o código do projeto antigo está totalmente testado, estável e confiável. Limpe arquivos e configurações desnecessários para manter o conteúdo do repositório de código limpo e reutilizável.
Refine os comportamentos de negócio específicos e as ações principais:
-
Extraia funções principais: No projeto antigo, extraia o código dos módulos de função principais para os módulos confirmados como reutilizáveis. Exemplos:
Gerenciamento de usuários: registro de usuário, login e modificação de informações.
Exibição de mercadorias: lista de mercadorias, página de produto e função de busca.
Processamento de pedidos: criação de pedido, processamento de pagamento e atualizações de status de pedido.
Adicione comentários apropriados ao código dos módulos de função principais extraídos. Assim, os desenvolvedores poderão recuperar trechos de código convenientemente por meio de comentários inline no IDE.
Selecione arquivos de código do framework de negócio relevante e coloque-os na base de conhecimento de código corporativo. Reorganize o código do projeto antigo em uma estrutura modular. Separe o código de acordo com a divisão de responsabilidades entre as equipes proprietárias de cada módulo do novo projeto e estabeleça repositórios de código de módulos independentes:
Isolamento da base de conhecimento de código: Com base nos módulos de função do projeto, carregue o código preparado do projeto antigo nas bases de conhecimento de código correspondentes. Por exemplo, armazene o módulo de gerenciamento de usuários, o módulo de exibição de mercadorias e o módulo de processamento de pedidos em bases de conhecimento independentes diferentes.
Gerenciamento de permissões: Defina permissões de acesso apropriadas para que somente a equipe de desenvolvimento relevante possa visualizar a base de conhecimento daquele módulo. Isso evita interferência desnecessária durante o autocompletamento de código no IDE.
Especificações de arquivo de código
-
Linguagens e frameworks suportados:
Backend: Java, C#, C/C++, Go, Python.
Frontend: JavaScript, TypeScript, Vue, React.
Limites de upload: O sistema aceita somente arquivos de código-fonte. O repositório de código deve conter somente os arquivos de código-fonte que você realmente escreveu. Por exemplo, carregue arquivos
.javapara Java, arquivos.cspara C# e arquivos.jsou.jsxpara JavaScript.-
Evite carregar o seguinte conteúdo:
Dados e código de teste: Não carregue scripts de teste, casos de teste ou qualquer código relacionado a teste que não contenha lógica de negócio.
Métodos mock: Exclua todo o código gerado por métodos e ferramentas de mock, a menos que o código contenha implementações específicas de lógica de negócio.
-
Artefatos de build:
Frontend: Exclua arquivos gerados por ferramentas de build como Webpack e Gulp. Esses arquivos geralmente estão localizados no diretório
distoubuild.Backend: Exclua arquivos DLL compilados e todas as outras saídas de compilação.
-
Requisitos de comentários:
Adicione comentários detalhados no cabeçalho de cada função que deseja recuperar.
Os comentários devem fornecer informações suficientes para distinguir funções diferentes. Consulte um modelo de comentário ou ajuste os comentários de acordo com as especificações da sua empresa.
/**
* Update the status of a specified order.
*
* @param orderId The unique identifier of the order.
* @param newStatus The new order status.
* @return boolean Indicates whether the update is successful.
*/
-
Requisitos de nomenclatura de funções:
Se os comentários da função forem breves, o nome da função deve descrever com precisão a sua funcionalidade.
Utilize nomes claros e descritivos, como
exportOrdersToPDFeupdateOrderStatus, em vez defunc1.
Diretrizes de upload
Arquivos compactados: Empacote os arquivos de código no formato
.zip,.gzou.tar.gz.Limite de tamanho do pacote de código: Cada pacote de código não deve exceder 100 MB.
Como desenvolvedores utilizam o aprimoramento do autocompletamento de código corporativo
O aprimoramento do autocompletamento de código corporativo recupera código dos repositórios que sua empresa carrega. Antes de experimentar as práticas a seguir, certifique-se de que o código alvo já está no repositório de código corporativo.
Melhores práticas de backend
Gere código a partir de comentários em linguagem natural
Carregue código no repositório de código corporativo: Carregue um pacote compactado que contenha o código de função necessário no repositório de código corporativo, por exemplo o código do algoritmo Snowflake. Certifique-se de que a função alvo siga a especificação de comentários com os comentários posicionados no cabeçalho da função. Para obter mais informações sobre como preparar o repositório de código, consulte How administrators prepare a high-quality enterprise code repository.
/**
* Use the Snowflake algorithm to generate a unique serial number
* @param workerId
* @return
*/
public synchronized Long getSnowFlowerId(long workerId){
long id = -1L;
if (workerId < 0 || workerId > snowFlowerProperties.getMaxWorkerId()) {
throw new IllegalArgumentException(
String.valueOf("workerID must gte 0 and lte " + snowFlowerProperties.getMaxWorkerId()));
}
// ... algorithm implementation code ...
return id;
}
Insira comentários: No IDE, localize uma classe Java e insira um comentário que corresponda à função que você deseja recuperar. O formato do comentário pode ser flexível, mas certifique-se de que o significado seja preciso e consistente.
Método 1
//Please generate code that uses the Snowflake algorithm to generate a unique ID and returns the generated ID
Método 2
/**
* Use the Snowflake algorithm to generate a unique serial number
* @param wId
* @return
*/
Requisitos de comentários:
Comprimento do comentário: Evite comentários excessivamente curtos ao escrever código. Utilize pelo menos 15 caracteres. Comentários muito curtos não conseguem acionar a recuperação.
Semântica do comentário: Certifique-se de que a semântica dos comentários seja precisa e significativa. Inclua palavras-chave e descrições de valor de retorno sempre que possível, para que o Qoder CN possa compreender e corresponder com precisão ao código adequado.
Suporte a múltiplos idiomas: Há suporte para comentários em chinês e inglês. Os comentários no repositório de código e os comentários usados durante a codificação real podem estar em idiomas diferentes.
-
Flexibilidade do nome do parâmetro: Você pode tratar os nomes dos parâmetros com flexibilidade. O Qoder CN ajusta automaticamente os parâmetros fornecidos para corresponder ao código recuperado. A seguir estão exemplos negativos:
//Snowflake algorithm— Problema: Não são fornecidas informações suficientes e o comentário é muito curto.//Generate a unique serial number— Problema: Nenhuma palavra-chave específica é utilizada, o que pode afetar a compreensão e a correspondência.
Geração de código: Após pressionar Enter pela primeira vez, o Qoder CN fornece uma sugestão de autocompletamento gerada a partir do comentário. Ao pressionar Enter novamente, o Qoder CN completa o código com base no código do repositório de código corporativo.
/**
* Use the Snowflake algorithm to generate a unique serial number
* @param workerId
* @return
*/
public synchronized Long get(long workerId) {
long id = -1L;
if (workerId < 0 || workerId > snowFlowerProperties.getMaxWorkerId()) {
throw new IllegalArgumentException(
String.valueOf("workerID must gte 0 and lte " + snowFlowerProperties.getMaxWorkerId()));
}
long timestamp = timeGen();
if (timestamp < lastTimestamp) {
long refusedSeconds = (lastTimestamp - timestamp) / 1000;
throw new RuntimeException(
String.valueOf("Clock moved backwards. Refusing for " + refusedSeconds + " seconds"));
}
if (lastTimestamp == timestamp) {
// Within the same millisecond, the sequence number is incremented
sequence = (sequence + 1) & snowFlowerProperties.getSequenceMask();
if (sequence == 0) {
// The maximum number of sequence numbers in the same millisecond has been reached
timestamp = tilNextMillis(lastTimestamp);
}
} else {
// In different milliseconds, the sequence number is set to 0
sequence = 0L;
}
lastTimestamp = timestamp;
// Timestamp part
id = (timestamp - snowFlowerProperties.getTwepoch()) << snowFlowerProperties.getTimestampLeftShift();
// Worker identifier part
id |= (workerId << snowFlowerProperties.getWorkerIdShift());
// Sequence number part
id |= sequence;
return id;
}
Se o seu comentário contiver parâmetros, o Qoder CN ajusta automaticamente os parâmetros no código gerado para garantir a consistência de nomenclatura.
Para atualizar o cache e obter novas sugestões de autocompletamento, pressione
⌥(option)+Pno macOS ouAlt+Pno Windows para acionar manualmente o autocompletamento de código inline.
Gere código a partir de assinaturas de função
Envie código ao repositório de código corporativo: Envie um pacote compactado que contenha o código de função necessário ao repositório de código corporativo. Certifique-se de que essas funções possuam identificadores claros e exclusivos para recuperação e reconhecimento. Para obter mais informações sobre como preparar o repositório de código, consulte How administrators prepare a high-quality enterprise code repository.
Insira assinaturas de função: No IDE, localize uma classe Java e insira a assinatura da função alvo. Você pode tratar os nomes dos parâmetros com flexibilidade. O Qoder CN ajusta automaticamente os parâmetros fornecidos para corresponder ao código recuperado.
public List<Object> nextList(String name, int size)
Requisitos de assinatura de função:
Nome da função: Utilize um nome de função claro com semântica suficiente para servir de base para a correspondência por similaridade.
-
Parâmetros e valores de retorno: Os tipos e a ordem devem corresponder à função alvo, mas você pode tratar os nomes dos parâmetros com flexibilidade. O Qoder CN ajusta automaticamente os parâmetros fornecidos para corresponder ao código recuperado. A seguir estão exemplos negativos:
public List<Object> func1(String name, int size)— Problema: O nome da função possui semântica pouco clara e não consegue refletir com precisão a funcionalidade.public List<String> nextList(int orderId)— Problema: Os tipos de parâmetro e o tipo de valor de retorno não correspondem à função alvo.
Sugestão de autocompletamento: Após pressionar Enter pela primeira vez, o Qoder CN fornece uma sugestão de autocompletamento de código. Ao pressionar Enter novamente, o Qoder CN completa automaticamente o código com base no código do repositório de código corporativo.
O Qoder CN ajusta automaticamente os nomes dos parâmetros no código gerado com base nos nomes de parâmetros que você fornece, para garantir a consistência de nomenclatura.
Para atualizar o cache e receber novas sugestões de autocompletamento, pressione
⌥(option)+Pno macOS ouAlt+Pno Windows para acionar manualmente o autocompletamento de código inline.
Melhores práticas de frontend
Complete o código de componentes personalizados frontend a partir de tags
Faça upload de código para o repositório de código corporativo: Antes de começar, certifique-se de que todo o código de componente frontend necessário foi carregado no repositório de código corporativo. O exemplo a seguir utiliza o framework React:
<LTable
isReady={isReady}
formInitialValues={formInitialValues}
rowKey="key"
tableRef={tableRef}
toolbarLeft={
<Button type="primary">Add</Button>
}
formItems={formItems}
formRef={formRef}
columns={columns}
request={async (params, requestType) => {
const res: Record<string, any> = await apiGetUserList(params);
return {
data: res.data,
total: res.total,
};
}}
/>
Escreva o código do componente: Abra o arquivo
.jsxcorrespondente no seu IDE e comece a escrever o código. Insira uma tag HTML básica ou uma tag de componente personalizado, como<LTable />.Autocompletamento de código: Quando o código inserido atinge um determinado comprimento e corresponde ao código na biblioteca de componentes corporativa, o IDE aciona automaticamente o autocompletamento de código e gera o código completo do componente. Pressione Enter também para acionar o autocompletamento de código manualmente.
Acione o autocompletamento dentro de uma tag de componente completa.
Gere código a partir de comentários em linguagem natural
Carregue código no repositório de código corporativo: Carregue um pacote compactado que contenha o código de função necessário no repositório de código corporativo. Certifique-se de que cada função siga a especificação de comentários com os comentários posicionados no cabeçalho da função. Para obter mais informações sobre como preparar o repositório de código, consulte How administrators prepare a high-quality enterprise code repository. O exemplo a seguir utiliza JavaScript:
/**
* Generate an object keyed by id based on error messages
* @param {Array<validator,Result>} results
* @return {Record<string,string>}
*/
function getErrObj(results) {
// ... function implementation code ...
}
Insira comentários: No IDE, insira o conteúdo de comentário específico em um arquivo JavaScript, conforme mostrado no exemplo a seguir:
//Generate an object keyed by id based on error messages
Requisitos de comentários:
Comprimento do comentário: Evite comentários excessivamente curtos ao escrever código. Utilize pelo menos 15 caracteres. Comentários muito curtos não conseguem acionar a recuperação.
Semântica do comentário: Certifique-se de que a semântica dos comentários seja precisa e significativa. Inclua palavras-chave e descrições de valor de retorno sempre que possível, para que o Qoder CN possa compreender e corresponder com precisão ao código adequado.
Suporte a múltiplos idiomas: Há suporte para comentários em chinês e inglês. Os comentários no repositório de código e os comentários usados durante a codificação real podem estar em idiomas diferentes.
Flexibilidade do nome do parâmetro: Você pode tratar os nomes dos parâmetros com flexibilidade. O Qoder CN ajusta automaticamente os parâmetros fornecidos para corresponder ao código recuperado.
Geração de código: Após pressionar Enter pela primeira vez, o Qoder CN fornece uma sugestão de autocompletamento gerada a partir do comentário. Ao pressionar Enter novamente, o Qoder CN completa o código com base no código do repositório de código corporativo.
//Generate an object keyed by id based on error messages
export function getErrObj(results) {
if (!results || results.length <= 0) return {};
const obj = {};
for (let i = 0; i < results.length; i++) {
const result = results[i];
if (result.ok === false) {
obj[result.id] = result.msg || '';
}
}
return obj;
}
Se o seu comentário contiver parâmetros, o Qoder CN ajusta automaticamente os nomes dos parâmetros no código gerado para garantir a consistência de nomenclatura.
Para atualizar o cache e obter novas sugestões de autocompletamento, pressione
⌥(option)+Pno macOS ouAlt+Pno Windows para acionar manualmente o autocompletamento de código inline.
Perguntas frequentes
Após a reinstalação, você ainda não consegue recuperar o código na base de conhecimento, mesmo após reiniciar o IDE ou fazer login novamente.
Solução:
-
No macOS, execute o comando a seguir para reiniciar o processo e limpar o cache:
ps -ef|grep lingma|grep start|awk '{print $2}'|xargs -I {} kill -9 {} No Windows, finalize o processo do Qoder CN no Task Manager.