素晴らしい質問！

答えはイエスですが、いくつかの実用的な警告があります。

これらのフレームワークがコードベースをより理解しやすく、柔軟で保守可能にするために存在することを覚えておくことは常に重要です。これにより、コードに取り組んでいる人々が自分の仕事をしやすくなります。元のコードを書かず、コードベースに貢献している人には最大限の利点があります。したがって、原則は一般的にほとんどの言語にも適用されます。特に、オブジェクト指向の機能を持たない言語、特にコード組織をモジュール、パッケージ、ファイルなどに許可するものでも。その結果、それらに適用される固体原理の側面を選択して選択する必要があります。したがって、これらの原則がどのように適用されるかに対する常識的なアプローチが重要です。

堅実な原則の実用的な実装には、最初は追加の努力が必要ですが、コードベースの機能が成長するにつれて、配当を支払います。したがって、これらの原則は、言語に関係なく、より大きなチームやプロジェクトに利益をもたらします。設定された時間内にこれらの原則を適用する配当が、コードベースまたはその時点で成長していないために発生しない場合、過剰エンジニアリングが発生します。たとえば、成長する可能性が低い小さなコードベースで1人だけが働いている場合、固体原理を厳密に使用すると、過剰なエンジニアリングにつながる可能性があります。

このアプローチへの警告には、新しいコードと将来のリファクタリングを介してコードに適用される金額と、設計原則のどれだけが実装されているかを決定することが含まれます。多くの実用的な場合、コードリファクタリングプロセスを介して必要とされるため、設計上の決定の一部を実装することをお勧めします。このアプローチは、必要に応じて原則を実装する必要性のバランスをとり、厳しい制約なしで新しいコードを作成するのに役立ちます。
Great question!

The answer is yes, but with some practical caveats.

It's always important to remember that these frameworks exist to make codebases more understandable, flexible, and maintainable. This makes it easier for people working on the code to do their work. It has maximum benefits for people who did not write the original code and are contributing to the codebase. So the principles apply generally to most languages, even those without object-oriented features, especially those that allow code organisation into modules, packages, files, etc. Consequently, one has to pick and choose aspects of the SOLID principles that apply to them. So a common sense approach to how these principles are applied is important.

Practical implementation of SOLID principles requires additional effort initially but pays dividends as the team and features in the code base grow. Therefore, these principles benefit larger teams and projects regardless of language. Over-engineering happens if the dividends of applying these principles within a set time don't occur due to the codebase or the team not growing in that time. For example, if only one person works on a small codebase that is unlikely to grow, using SOLID principles strictly may lead to over-engineering. 

The caveats to this approach involve deciding on how much of the design principles are implemented on new code vs how much they are applied to code via future refactoring. In many practical cases, it is better to implement some of the design decisions as the need arises via a code refactoring process. This approach helps balance the need to implement the principles as required and write new code without stringent constraints.