You are on the right track. Everything I say below is in relation to the "ideal" case. Depending how big your code is, and what you are trying to do, it might not be practical. What are you trying to program?
You should probably be utilizing the interface of the FC/FB (the area that says in/out/temp, etc, at above the code) for all of your tags. Inputs and outputs should be used for information that comes from outside your program: either IO or data from other sections of the PLC code. Temps can be used for data that can be forgotten at the end of the program. These can be things like the middle steps of math problems, or a value you are only using once in the next rung. STAT variables are only available in FB's, and the value is stored between scans.
How to choose between FB and FC: If your program state is determined entirely by the inputs, and not on the past, then an FC is good. If you were creating an ADD block, then an FC would be a good choice. If your program needs to remember its state from cycle to cycle, then you should use an FB. If, for example, you wanted to have a running average of a process value, then you would use an FB, and store the previous values as STATs. An FC stores its data in local memory, which is lost at the end of the program. An FB stores all its data (except TEMPs) in its instance DB, to be used next scan.
It is possible to call one FB inside another, and use the same instance DB for everything. This is called "Multi-Instance".
If you program this way, with all tags as internal tags, then it is very easy to simply call the code again later, with different inputs, and effectively double your code in a short time.
Depending on how big your program is, it might not be practical to create 100 or 1000 inputs and outputs for all your real life hardware. In that case, if you want to avoid overlap, creating a DB might make the most sense. You can go back later and change all the DB references to the actual tags you want.
I also typically recommend that you not use the M memory for anything but testing tags, and that you use DB's for most things. If you know that the M memory is almost entirely testing, it makes it very easy later to make sure that all your test bits have been removed.