# How to arrange code folders with dependencies > Do not try to represent `graph` using `tree`. It's impossible ## Upper-Bottom Layers v.s. Child-Parent relationship When you have conceptually related components with dependencies like this at the beginning ```graphviz digraph D { A -> B A -> C A -> D } ``` Please do NOT put them into folders in this way ```shell= /A -/B -/C -/D ``` Why? Becuase one day it might suddenly become ```graphviz digraph D { A -> B A -> C A -> D A2->D } ``` Now A and A2 shares D but A and A2 has no relationships. How can you arrange you folder? So the recommended approach is here ``` /B /C /D /A /A2 ``` Just give up representing a graph by using a tree. It's not possibile unless you want to duplicate things. If you have confidence that A and A2 are in the same level, while BCD is the next level. Then you can do ``` /layer1 -/A -/A2 /layer2 -/B -/C -/D ``` To represent this: ```graphviz digraph D { subgraph cluster_layer1 { A; A2; } subgraph cluster_layer2 { B; C; D; } A -> B A -> C A -> D A2->D } ``` Now let's do an exercise, We got an F node that will points to A and D and G node that will points to A and C and F. How do you arrange the folder? ```graphviz digraph D { F, G subgraph cluster_layer1 { A; A2; } subgraph cluster_layer2 { B; C; D; } A -> B A -> C A -> D A2->D F->A F->D G->A G->C } ``` Right, we do this ``` /F /G /layer1 -/A -/A2 /layer2 -/B -/C -/D ``` What happens frequently is that we often misunderstand something as a root and start creating sub folders for it. And suddenly there comes another "root" like A2, and then F and then G. To be ready for new nodes joining, the recommended approach is that do not think in a parent-child relationship. Instead, think of a "upper layer and bottom layer" relationship, which is more extendable. ## Real life Example simplified You write a web service like this at the beginning ```shell= /server -/orders/getOrders ``` Which seem making sense. Now you want to write a script for some routined maintenence purpose. ```shell= /maintenence -/whateverScripts /server -/orders/getOrders ``` Suddenly! You found that the `server/order/getOrder` function is quite reusable. And you want to reuse that logic in this maintenence task. So the depdendencies is like this ```graphviz digraph D { rankdir=BT order; getOrder; server; maintenence server -> order order -> getOrder maintenence -> order } ``` However, your code in maintenence mostly will be like this ``` /maintenence -/whateverScripts(import from ../server/orders/getOrders) /server -/orders/getOrders ``` That's the mistaken part. The second line will bring a misunderstanding on the dependencies, people will misunderstand that the offline maintenence requries the server, like the graph below, which is not true. ```graphviz digraph D { rankdir=BT order; getOrder; server; maintenence server -> order order -> getOrder maintenence -> server label = "wrong relationhips (maintenence does not depend on server)" } ``` Do you need to start a server in order to complete the maintenence task? No! You just need the getOrders piece of reusable logic. Instead, you should arrange the code folders like this ``` /order -/getOrders /maintenence -/whateverScripts(import from ../orders/getOrders) /server -/whatverService(import from ../orders/getOrders) ``` Now this dependency matches to actual dependencies ```graphviz digraph D { rankdir=BT order; getOrder; server; maintenence server -> order order -> getOrder maintenence -> order } ```