# Code Smell 283 - Unresolved Meta Tags

> TL;DR: Incomplete or null meta tags break functionality and user experience.

# Problems

- Tags appear in output
- Email texts include placeholders between human-readable text
- Missed placeholders confuse users
- Websites are rendered with strange characters
- [Null](https://maximilianocontieri.com/null-the-billion-dollar-mistake) values trigger errors
- Potential [security injection vulnerabilities](https://maximilianocontieri.com/code-smell-189-not-sanitized-input)

# Solutions

1. Validate meta tags
2. Assert completeness early
3. [Fail Fast](https://maximilianocontieri.com/fail-fast)
4. Avoid [null](https://maximilianocontieri.com/refactoring-015-remove-null) values
5. Throw meaningful exceptions
6. Automate meta validation
 
# Context

When you leave meta tags unfinished, such as `{user_name}` or `{product_name}`, they often sneak into your final output. Imagine sending an email that says, "Hi {user_name}, your order for {product_name} is ready." 

It screams unprofessionalism and confuses users.

[Null](https://maximilianocontieri.com/code-smell-12-null) values worsen things by causing crashes or silent failures, leading to bad user experiences or broken processes.

You can avoid this by asserting completeness before rendering or sending. 

When your code finds an incomplete meta tag or a null value, stop the process immediately and throw an exception.

# Sample Code

## Wrong

<!-- [Gist Url](https://gist.github.com/mcsee/4beca4e8726130c29a74b956df6aefe2) -->

```php
<?php

$emailBody = "Hello {user_name}, 
your order for {product_name} is confirmed.";

// You forget to make the replacements
sendEmail($emailBody);
```

## Right

<!-- [Gist Url](https://gist.github.com/mcsee/4beca4e8726130c29a74b956df6aefe2) -->

```php
<?php

$emailBody = "Hello {user_name},
your order for {product_name} is confirmed.";

if (strpos($emailBody, '{') !== false) {
    throw new Exception(
        "Incomplete meta tags found in email body.");
}
sendEmail($emailBody);
```

# Detection

[X] Automatic 

You can detect this smell with automated tests or linters scanning unfinished placeholders ({} or similar patterns). 

# Tags

- Fail Fast

# Level

[X] Beginner

# Why the Bijection Is Important 

Your system must maintain a one-to-one mapping when representing user data with placeholders. 

You break this mapping if your {user_name} placeholder exists but lacks a corresponding real name. 

This causes errors, confusion, and a loss of trust in your application. 

Ensuring [bijection](https://maximilianocontieri.com/the-one-and-only-software-design-principle) compliance avoids these issues.

# AI Generation

AI tools sometimes introduce this smell when generating templates with placeholders but fail to substitute real data. 

You must validate and complete all placeholders before using the output.

# AI Detection

AI tools like linters or email rendering validators can detect unfinished meta tags if you configure them correctly. 

Use these tools to automate meta-tag detection and reduce human error.

## Try Them!

*Remember: AI Assistants make lots of mistakes*

| Without Proper Instructions    | With Specific Instructions |
| -------- | ------- |
| [ChatGPT](https://chat.openai.com/?q=Correct+and+explain+this+code%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0A%24emailBody+%3D+%22Hello+%7Buser_name%7D%2C+%0D%0Ayour+order+for+%7Bproduct_name%7D+is+confirmed.%22%3B%0D%0A%0D%0A%2F%2F+You+forget+to+make+the+replacements%0D%0AsendEmail%28%24emailBody%29%3B%0D%0A%60%60%60) | [ChatGPT](https://chat.openai.com/?q=Convert+it+to+more+declarative%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0A%24emailBody+%3D+%22Hello+%7Buser_name%7D%2C+%0D%0Ayour+order+for+%7Bproduct_name%7D+is+confirmed.%22%3B%0D%0A%0D%0A%2F%2F+You+forget+to+make+the+replacements%0D%0AsendEmail%28%24emailBody%29%3B%0D%0A%60%60%60) |
| [Claude](https://claude.ai/new?q=Correct+and+explain+this+code%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0A%24emailBody+%3D+%22Hello+%7Buser_name%7D%2C+%0D%0Ayour+order+for+%7Bproduct_name%7D+is+confirmed.%22%3B%0D%0A%0D%0A%2F%2F+You+forget+to+make+the+replacements%0D%0AsendEmail%28%24emailBody%29%3B%0D%0A%60%60%60) | [Claude](https://claude.ai/new?q=Convert+it+to+more+declarative%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0A%24emailBody+%3D+%22Hello+%7Buser_name%7D%2C+%0D%0Ayour+order+for+%7Bproduct_name%7D+is+confirmed.%22%3B%0D%0A%0D%0A%2F%2F+You+forget+to+make+the+replacements%0D%0AsendEmail%28%24emailBody%29%3B%0D%0A%60%60%60) |
| [Perplexity](https://perplexity.ai/?q=Correct+and+explain+this+code%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0A%24emailBody+%3D+%22Hello+%7Buser_name%7D%2C+%0D%0Ayour+order+for+%7Bproduct_name%7D+is+confirmed.%22%3B%0D%0A%0D%0A%2F%2F+You+forget+to+make+the+replacements%0D%0AsendEmail%28%24emailBody%29%3B%0D%0A%60%60%60) | [Perplexity](https://perplexity.ai/?q=Convert+it+to+more+declarative%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0A%24emailBody+%3D+%22Hello+%7Buser_name%7D%2C+%0D%0Ayour+order+for+%7Bproduct_name%7D+is+confirmed.%22%3B%0D%0A%0D%0A%2F%2F+You+forget+to+make+the+replacements%0D%0AsendEmail%28%24emailBody%29%3B%0D%0A%60%60%60) |
| [Copilot](https://www.bing.com/chat?showconv=1&sendquery=1&q=Correct+and+explain+this+code%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0A%24emailBody+%3D+%22Hello+%7Buser_name%7D%2C+%0D%0Ayour+order+for+%7Bproduct_name%7D+is+confirmed.%22%3B%0D%0A%0D%0A%2F%2F+You+forget+to+make+the+replacements%0D%0AsendEmail%28%24emailBody%29%3B%0D%0A%60%60%60) | [Copilot](https://www.bing.com/chat?showconv=1&sendquery=1&q=Convert+it+to+more+declarative%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0A%24emailBody+%3D+%22Hello+%7Buser_name%7D%2C+%0D%0Ayour+order+for+%7Bproduct_name%7D+is+confirmed.%22%3B%0D%0A%0D%0A%2F%2F+You+forget+to+make+the+replacements%0D%0AsendEmail%28%24emailBody%29%3B%0D%0A%60%60%60) |
| [Gemini](https://gemini.google.com/?q=Correct+and+explain+this+code%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0A%24emailBody+%3D+%22Hello+%7Buser_name%7D%2C+%0D%0Ayour+order+for+%7Bproduct_name%7D+is+confirmed.%22%3B%0D%0A%0D%0A%2F%2F+You+forget+to+make+the+replacements%0D%0AsendEmail%28%24emailBody%29%3B%0D%0A%60%60%60) | [Gemini](https://gemini.google.com/?q=Convert+it+to+more+declarative%3A+%60%60%60php%0D%0A%3C%3Fphp%0D%0A%0D%0A%24emailBody+%3D+%22Hello+%7Buser_name%7D%2C+%0D%0Ayour+order+for+%7Bproduct_name%7D+is+confirmed.%22%3B%0D%0A%0D%0A%2F%2F+You+forget+to+make+the+replacements%0D%0AsendEmail%28%24emailBody%29%3B%0D%0A%60%60%60) | 

# Conclusion

Incomplete meta tags are more than just sloppy—they're harmful. Validate tags, assert completeness, and throw exceptions when needed. 

Handling meta tags carefully prevents errors and ensures a professional experience.

# Relations

%[https://maximilianocontieri.com/code-smell-12-null]

%[https://maximilianocontieri.com/code-smell-139-business-code-in-the-user-interface]

%[https://maximilianocontieri.com/code-smell-97-error-messages-without-empathy]

# More Info

%[https://maximilianocontieri.com/fail-fast]

%[https://maximilianocontieri.com/null-the-billion-dollar-mistake]

# Disclaimer

Code Smells are my [opinion](https://maximilianocontieri.com/i-wrote-more-than-90-articles-on-2021-here-is-what-i-learned).

# Credits

Photo by [Tomas Martinez](https://unsplash.com/@tomasmartinez) on [Unsplash](https://unsplash.com/photos/black-and-white-checkered-textile-axYekjy6Kn4)
        
* * *

> The best error message is the one that never shows up.

_Thomas Fuchs_
 
%[https://maximilianocontieri.com/software-engineering-great-quotes]

* * *

This article is part of the CodeSmell Series.

%[https://maximilianocontieri.com/how-to-find-the-stinky-parts-of-your-code]
