Best practices for project architecture when using C++ and Blueprints

hello Structure.

I have a certain design philosophy about UE4 that seems to work very well. My CORE gameplay objects are written in C++. My custom Actors, Pawns, Objects that are going to be utilized by my game. I build these things with blueprints in mind so that a designer can blueprint my core objects and extend them and hook into various exposed events through blueprints without needing to know C++.

As an example one of the systems I designed was an magic effect system. I began by creating an effect object from UObject and making it blueprintable. I added some basic functions such as “ApplyToTarget” and “RemoveFromTarget” that can be implemented in blueprints but also overriden in C++ if I want to extend the C++ object. Now my designers can take that base magic effect object in the editor and create any any effect they want from it and they don’t have to know C++. There are several other objects written in C++ that worry about the details of containing the effects, when and how they are applied, and even replication; but the designer gets full control of what the effect does when it is applied.

So build in C++ to be utilized in Blueprints.

UPDATE
I wanted to make a quick note on the main reason why. In the situation I described above, imagine having over 100 different effect classes in your solution. I personally like to keep my code as clean as possible, so having that many effects (to me) seems WAY more manageable from the editor than in hard coded objects in C++.

Overall when I am building my C++ object I always ask myself (What do I want control of in Blueprints, and How could I make changes to that without C++).