Files
ltk/code_style_guide.md

3.5 KiB
Executable File

Code Style Guide

This project follows a Modified Allman brace and formatting style. It prioritizes visual clarity, symmetry, and logical separation of blocks over strict line compactness.


Overview

Key Principles

  • Indentation with tabs (width = 4).
  • Opening braces { always start on a new line.
  • } else { and } catch { appear on the same line for compact flow.
  • Spaces inside parentheses only when non-empty:
    • ( arg1, arg2 )
    • main()
  • Classes and structs: PascalCase
  • Variables, objects, and functions: camelCase
  • Constants/macros: UPPER_CASE_WITH_UNDERSCORES

Examples

if / else structure

if ( condition )
{
	doSomething();
} else {
	doSomethingElse( arg1, arg2 );
}

try / catch structure

try
{
	runOperation();
} catch ( const std::exception& ex ) {
	handleError( ex );
}

Class and method naming

class DataAnalyzer
{
public:
	DataAnalyzer( const std::string& filePath )
		: filePath( filePath )
	{
	}

	void processDataAndGenerateReport()
	{
		try
		{
			loadDataFromFile( filePath );
			analyzeResultsAndPrintSummary();
		} catch ( const std::runtime_error& error ) {
			std::cerr << "Error: " << error.what() << std::endl;
		}
	}

private:
	std::string filePath;

	void loadDataFromFile( const std::string& path )
	{
		if ( path.empty() )
		{
			throw std::runtime_error( "File path cannot be empty." );
		} else {
			std::cout << "Loading data from: " << path << std::endl;
		}
	}

	void analyzeResultsAndPrintSummary()
	{
		std::cout << "Analyzing data..." << std::endl;
		std::cout << "Summary: OK" << std::endl;
	}
};

main() function

int main()
{
	DataAnalyzer analyzer( "results.csv" );

	try
	{
		analyzer.processDataAndGenerateReport();
	} catch ( const std::exception& ex ) {
		std::cerr << "Unhandled exception: " << ex.what() << std::endl;
	}

	return 0;
}

.clang-format configuration

Save this file as .clang-format in your project root:

# === Style: Modified Allman (tabs, compact else/catch, and selective parentheses spacing) ===
# Naming conventions:
#   · Classes and structs: PascalCase (e.g., MyClass, PlayerController)
#   · Variables, objects, and functions: camelCase (e.g., myVariable, calculateScore)
#   · Constants or macros: UPPER_CASE_WITH_UNDERSCORES
#   · if/else and try/catch share the same brace layout:
#         if ( condition )
#         {
#             ...
#         } else {
#             ...
#         }
#         try
#         {
#             ...
#         } catch ( const std::exception& e ) {
#             ...
#         }

BasedOnStyle: LLVM

IndentWidth: 4
UseTab: Always

BraceWrapping:
  AfterClass: true
  AfterControlStatement: true
  AfterEnum: true
  AfterFunction: true
  AfterNamespace: true
  AfterStruct: true
  AfterUnion: true
  BeforeCatch: false
  BeforeElse: false
  IndentBraces: false
  SplitEmptyFunction: false
  SplitEmptyRecord: false
  SplitEmptyNamespace: false

AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AllowShortFunctionsOnASingleLine: false

SpaceBeforeParens: Always
SpaceInEmptyParentheses: false
SpaceInParens: true
SpacesInAngles: false
SpacesInCStyleCastParentheses: true
SpacesInSquareBrackets: false

KeepEmptyLinesAtTheStartOfBlocks: true
ColumnLimit: 0
AlignConsecutiveAssignments: true
AlignConsecutiveDeclarations: true
AlignEscapedNewlines: Left
AlignOperands: true
AlignTrailingComments: true

BreakBeforeBraces: Allman