{'fraction_non_alphanumeric': 0.020224719101123594, 'fraction_numerical': 0.0, 'mean_word_length': 5.6138613861386135, 'pattern_counts': {'":': 0, '<': 0, '<?xml version=': 0, '>': 0, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
How to Handle Interacting Concerns

Concerns in software applications can range from general-purpose concerns such as tracing, synchronization or error handling, to more specific ones such as scheduling in simulation domains or time constraints in real-time systems. An appropriate separation of concerns is supposed to reduce software complexity and improve software evolution, by keeping track of different decomposition criteria (software dimensions) at the same time. Usually relevant concerns vary over time, are not orthogonal and conflicting among them, and become very domain-specific. Reasoning about a flexible way of handling aspects involving interaction of concerns still remains as an open challenge. In this context, we present an example based on the simulation of a thermic control system, showing how aspects related to mathematical models, concurrency, scheduling and optimizations, are scattered across the system, and how these interacting concerns are separated from the core functionality but coupled among them. A reflective approach is used to support these aspects within an object-oriented language. This work hopes to contribute to discuss how interacting (and often conflicting) concerns work in practice, and encourage developers towards a more systematic approach for an effective separation of concerns.