Skip to content

Commit

Permalink
[#540] [DC] Actualize implementation flow. Rephrase content
Browse files Browse the repository at this point in the history
  • Loading branch information
lyskouski committed Feb 12, 2025
1 parent 9c6c0bd commit c82cd0e
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 53 deletions.
26 changes: 13 additions & 13 deletions docs/implementation-flow/ch05-s02-refactoring.tex
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
\subsection{Refactoring by Principles} \label{refactoring}
\markboth{Unleashing}{Refactoring by Principles}

Having scrutinized the application's "skeleton" encompassing scalability and fault tolerance (\ref{benchmark}), it's
now an opportune juncture to delve into its "nervous system" -- ensuring alignment with architectural and code style
Having scrutinized the application's "skeleton", which includes scalability and fault tolerance (\ref{benchmark}),
it's now an opportune time to delve into its "nervous system" -- ensuring alignment with architectural and code style
principles.\\
\\

Expand Down Expand Up @@ -54,17 +54,17 @@ \subsection{Refactoring by Principles} \label{refactoring}
Open-Closed, Liskov Substitution, Interface Segregation, and Dependency Inversion.
\end{itemize}

\noindent We'll not dive into details of architectural and code style principles (check references above), and even
won't discuss made changes \issue{159}{} \issue{217}{}, by reminding only the semaphore approach (\ref{ut-fail}) that
declares refactoring only after a significant code coverage. Refactoring as a process of rearchitecting \cite{Chec23}
previously made decisions, to restate, revise and improve them by visualizing in a clean code.
\noindent We won't dive into details of architectural and code style principles (see references above), and even won't
discuss changes made \issue{159}{} \issue{217}{}, only recalling the semaphore approach (\ref{ut-fail}) that to declare
refactoring only after significant code coverage. Refactoring as a process of rearchitecture \cite{Chec23} previously
made decisions to restate, revise, and improve them by visualizing them in clean code.

As a note, it's worth noting that approaches can be mixed, such as combining design patterns like VIPER (View,
Presenter, Interactor, Router, Entity), MVVM (Model, View, ViewModel), or others, to represent business layer, with
Atomic Design \cite{Kama22} methodology, or other, for the presentation layer.
As a note, it's worth noting that approaches can be mixed, such as combining design patterns like VIPER (View, Presenter,
Interactor, Router, Entity), MVVM (Model, View, ViewModel), or others to represent the business layer, with Atomic Design
\cite{Kama22} methodology, or others, for the presentation layer.

In the context of extreme programming, the methodology includes a provision for pair programming \cite{Ligu19}. This
involves two programmers collaborating closely at a single workstation, communicating actively throughout the process
of writing each line of code. Delighting to restate and extremize that practice to next flow: the first developer
composing tests, followed by the second developer undertaking the implementation, and the third developer
performing an ultimate refactoring; and they're changing those "hats" \cite{Bono17} continuously.
involves two programmers working closely together at a single workstation, actively communicating throughout the process
of writing of writing each line of code. Pleasure to restate and extreme this practice to the next flow: the first
developer tests, followed by the second developer doing the implementation, and the third developer doing a final
refactoring. does a final refactoring; and they keep changing these "hats" \cite{Bono17}.
44 changes: 22 additions & 22 deletions docs/implementation-flow/ch06-s02-autofocus.tex
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,12 @@ \subsection{Managing Attention}
}
\end{lstlisting}

Proposal above might become overcomplicated for complex forms, so, we might take into account the usage of a state
machine, also known as a finite-state machine (FSM). It's a conceptual model that is used to describe the behavior of a
system in discrete states, transitions between those states, and actions associated with each state or transition.
\noindent The above suggestion might become too complicated for complex forms, so we might consider using a state machine,
also known as a finite-state machine (FSM). It's a conceptual model used to describe the behavior of a system in terms
of discrete states, transitions between those states, and actions associated with each state or transition.

For our case it should provide a scope of Focus Nodes and determine transition between them; to propagate it across
multiple widgets we'll use static class.
For our case, it should provide a set of focus nodes and determine the transition between them; to propagate it across
multiple widgets, we'll use the static class.

\begin{lstlisting}
class FocusController {
Expand Down Expand Up @@ -178,22 +178,22 @@ \subsection{Managing Attention}
}
\end{lstlisting}

\noindent One of the problem that we might face with is an inability to open dropdowns anymore since
\q{FocusScope.of(context).requestFocus} leads to re-build by any changed focus action. The problem is relevant to the
fact that we've been using \q{BuildContext} of our Form whereas it should be taken context from \q{DropdownButton}-element:
\noindent One of the problems we might face is an inability to open dropdowns anymore since
\q{FocusScope.of(context).requestFocus} leads to rebuilding by any changed focus action. The problem is relevant to the
fact that we've been using \q{BuildContext} of our form, whereas it should be taken context from \q{DropdownButton}-element:

\begin{lstlisting}
Form(build 'context1') -> Widget(build 'context2') -> ... -> Widget(build 'context3') -> TextFormField.
\end{lstlisting}

\noindent We should trigger \q{FocusController.setContext(context);} directly for \q{context3}, otherwise re-render will
block any additional interactions. But the right fix is to use context from our FocusNode:
\noindent We should trigger \q{FocusController.setContext(context)} directly for \q{context3}, otherwise re-rendering
will block any additional interaction. But the correct solution is to use the context of our \q{FocusNode}:

\begin{lstlisting}
FocusScope.of(nodes[focus].context!).requestFocus(nodes[focus]);
\end{lstlisting}

\noindent That also gives us capability to change \q{setContext}-method in order to store index of current element
\noindent This also gives us the ability to change the \q{setContext}-method to store the index of the current element
and its value:

\begin{lstlisting}
Expand Down Expand Up @@ -237,16 +237,16 @@ \subsection{Managing Attention}
}
\end{lstlisting}

\noindent We're continuing bravely fix errors that producing by our own, and the next might be nor obvious, nor trivial
till the fact how exactly \q{setState}-method should be used. While we've been testing our application in build OC mode,
an error is appeared on Android. The Flutter team tells us that everything will be cross-functional through all devices
and systems but it's only in the case when we're using a functionality as it's been expected from their side. And
the error is relevant to a lost state of values that's been defined inside \q{StatefulWidget} class of our
component that updated via \q{setState}-method inside \q{State}-extended class.
\noindent We're continuing to bravely fix errors that produce by our own, and the next might be neither obvious, nor
trivial until the fact how exactly \q{setState}-method should be used. While we're testing our application in build OC
mode, an error appears on Android. The Flutter team tells us that everything will be cross-functional through all devices
and systems, but it's only in case when we use a functionality as it was expected from their side. And the bug is relevant
to a lost state of values that's defined inside the \q{StatefulWidget} class of our component that was updated via the
\q{setState}-method inside the \q{State} extended class.

In our code, the issue with losing the form values state is related to the fact, that by assigning default values
directly to the fields, those values will not be preserved when the widget is rebuilt. To maintain the form values
state, we have to use the \q{initState}-method to initialize fields by provided values.
In our code, the problem with losing the state of the form values is related to the fact that by assigning default values
directly to the fields, these values are not preserved when the widget is rebuilt. To preserve the form values state,
we need to use the \q{initState}-method to initialize the fields with the provided values.

\begin{lstlisting}
class ExpensesTab extends StatefulWidget {
Expand Down Expand Up @@ -279,9 +279,9 @@ \subsection{Managing Attention}
\end{lstlisting}

\noindent And finally, let's refactor taken solution to make it reliable, by storing positions during components
initialization and making a delta scroll by their deduction (positions of the current element and the first one) --
initialization and do a delta scroll by deducting them (positions of the current element and the first one) --
\issue{164}{}, \issue{265}{172eb11}. An important tip is to assign a unique identifier (\q{id}-property) to each input
element. Otherwise, after a compilation, all objects created from the same widget-class may be identified as one
element. Otherwise, after a compilation, all objects created from the same widget class may be identified as one
(\cref{img:u-grid}) due to a similar \q{hashCode}-property \issue{127}{} \issue{408}{29ac970}.

\img{uiux/focus-issue}{Visualization of a simulaneous focus on multiple fields}{img:u-focus}
35 changes: 17 additions & 18 deletions docs/implementation-flow/ch07-s04-market.tex
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,23 @@ \subsection{Marketing}
\markboth{Productionizing}{Marketing}

Marketing is a critical aspect of any product's journey from development to success. While traditional advertising can
be costly, leveraging online platforms can be a cost-effective way to build brand awareness. Platforms like Facebook,
Instagram, Twitter, and LinkedIn provide ample opportunities to engage with the audience through content calendars,
regular posts, and interactions with followers. However, social media isn't just for promotion; it's a means to
create a community around our product. That's why understanding the audience is a valuable part of marketing strategy
(customer segmentation marketing and targeting, \cite{Fras20}).
be costly, leveraging online platforms can be a cost-effective way to build brand awareness. Platforms such as Facebook,
Instagram, Twitter, and LinkedIn provide ample opportunities to engage with audiences through content calendars,
regular posts, and interactions with followers. But social media isn't just for promotion; it's a way to community
around our product. That's why understanding your audience is a valuable part of your marketing strategy (customer
segmentation marketing and targeting, \cite{Fras20}).

The first crucial step in this process is to establish precise objectives for the product launch. Aggregating timelines
and milestones can be particularly advantageous in this context. These milestones effectively highlight the dynamic
and evolving nature of our product.
The first crucial step in this process is to establish precise objectives for the product launch. The aggregation of
timelines and milestones can be particularly beneficial. These milestones effectively highlight the dynamic and and
evolving nature of the product.

Some falsely believe that merely making their product or service available is enough, and customers will automatically
find and purchase from them without any personal interaction. It has misled many founders, especially those who have
heard stories about successful companies like Dropbox or Twilio that appear to have no sales staff.
Some mistakenly believe that simply making their product or service available is enough and that customers will
automatically find and buy from them without any personal interaction. This has misled many founders, especially those
who have heard stories about successful companies like Dropbox or Twilio that seem to have no sales force.

The launch is merely the start, not the conclusion. And sales skills are not innate; they can be learned like any other
skill \cite{Dixo11}. Sales is simply another challenge to overcome, much like the technical hurdles we've faced before.
Just as we've tackled complex technical issues by learning and problem-solving, we can approach sales with the same
determination and willingness to learn. Sustain engagement with the audience by implementing post-launch strategies,
such as frequent updates, responsive customer support, and soliciting reviews and feedback. The marketing is an ongoing
process, and post-launch activities are equally vital. With the appropriate strategy, we can pave the path for our
product's success in the market.
The launch is just the beginning, not the end. And sales skills are not innate; they can be learned like any other skill
\cite{Dixo11}. Sales is simply another challenge to overcome, much like the technical hurdles we've faced before. Just
as we've tackled complex technical problems through learning and problem solving, we can approach sales with the same
and willingness to learn. Maintain audience engagement by implementing post-launch strategies, such as frequent updates,
responsive customer support, and soliciting reviews and feedback. Marketing is an ongoing process, and post-launch
activities are equally important. With the right strategy, we can pave the way for our product's success in the marketplace.

0 comments on commit c82cd0e

Please sign in to comment.