Add Dos and Donts Section / Graph inputs
PiperOrigin-RevId: 509347658
This commit is contained in:
		
							parent
							
								
									caa7d85141
								
							
						
					
					
						commit
						ef9e5f881b
					
				| 
						 | 
					@ -275,3 +275,69 @@ Tip: the same as for the `RunInference` function, extracting
 | 
				
			||||||
`PassThroughNodeBuilder` and similar utility classes into dedicated modules
 | 
					`PassThroughNodeBuilder` and similar utility classes into dedicated modules
 | 
				
			||||||
enables reuse in graph construction code and helps to automatically pull in the
 | 
					enables reuse in graph construction code and helps to automatically pull in the
 | 
				
			||||||
corresponding calculator dependencies.
 | 
					corresponding calculator dependencies.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Dos and Don'ts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Define graph inputs at the very beginning if possible
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```c++ {.bad}
 | 
				
			||||||
 | 
					Stream<D> RunSomething(Stream<A> a, Stream<B> b, Graph& graph) {
 | 
				
			||||||
 | 
					  Stream<C> c = graph.In(2).SetName("c").Cast<C>();  // Bad.
 | 
				
			||||||
 | 
					  // ...
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CalculatorGraphConfig BuildGraph() {
 | 
				
			||||||
 | 
					  Graph graph;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Stream<A> a = graph.In(0).SetName("a").Cast<A>();
 | 
				
			||||||
 | 
					  // 10/100/N lines of code.
 | 
				
			||||||
 | 
					  Stream<B> b = graph.In(1).SetName("b").Cast<B>()  // Bad.
 | 
				
			||||||
 | 
					  Stream<D> d = RunSomething(a, b, graph);
 | 
				
			||||||
 | 
					  // ...
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In the above code:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*   It can be hard to guess how many inputs you have in the graph.
 | 
				
			||||||
 | 
					*   Can be error prone overall and hard to maintain in future (e.g. is it a
 | 
				
			||||||
 | 
					    correct index? name? what if some inputs are removed or made optional?
 | 
				
			||||||
 | 
					    etc.).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Instead, simply define your graph inputs at the very beginning of your graph
 | 
				
			||||||
 | 
					builder:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```c++ {.good}
 | 
				
			||||||
 | 
					Stream<int> RunSomething(Stream<A> a, Stream<B> b, Stream<C> c, Graph& graph) {
 | 
				
			||||||
 | 
					  // ...
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CalculatorGraphConfig BuildGraph() {
 | 
				
			||||||
 | 
					  Graph graph;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Stream<A> a = graph.In(0).SetName("a").Cast<A>();
 | 
				
			||||||
 | 
					  Stream<B> b = graph.In(1).SetName("b").Cast<B>();
 | 
				
			||||||
 | 
					  Stream<C> c = graph.In(2).SetName("c").Cast<C>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 10/100/N lines of code.
 | 
				
			||||||
 | 
					  Stream<D> d = RunSomething(a, b, c, graph);
 | 
				
			||||||
 | 
					  // ...
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And if you have an input stream or side packet that is not always defined -
 | 
				
			||||||
 | 
					simply use `std::optional` and put it at the very beginning as well:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```c++ {.good}
 | 
				
			||||||
 | 
					std::optional<Stream<A>> a;
 | 
				
			||||||
 | 
					if (needs_a) {
 | 
				
			||||||
 | 
					  a = graph.In(0).SetName(a).Cast<A>();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note: of course, there can be exceptions - for example, there can be a use case
 | 
				
			||||||
 | 
					where calling `RunSomething1(..., graph)`, ..., `RunSomethingN(..., graph)` is
 | 
				
			||||||
 | 
					**intended to add new inputs**, so afterwards you can iterate over them and feed
 | 
				
			||||||
 | 
					only added inputs into the graph. However, in any case, try to make it easy for
 | 
				
			||||||
 | 
					readers to find out what graph inputs it has or may have.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user