Reflexões sobre composição inspiradas no ggplot2

Uma das vantagens de estudar diversas linguagens, frameworks, técnicas e prática é encontrar inspiração inusitada para nosso código. Nesse post compartilho uma das minhas inspirações.

Inspiração: ggplot2

Pegando emprestada uma definição famosa:

The ggplot2 package, created by Hadley Wickham, offers a powerful graphics language for creating elegant and complex plots. Its popularity in the R community has exploded in recent years. Origianlly based on Leland Wilkinson’s The Grammar of Graphics, ggplot2 allows you to create graphs that represent both univariate and multivariate numerical and categorical data in a straightforward manner.

Dê uma olhada no bloco de código (em “R”) que segue (extraído daqui):

# install.packages("ggplot2")
# load package and data

options(scipen=999)  # turn-off scientific notation like 1e+48
library(ggplot2)

theme_set(theme_bw())  # pre-set the bw theme.
data("midwest", package = "ggplot2")
# midwest <- read.csv("http://goo.gl/G1K41K")  # bkup data source

# Scatterplot
gg <- ggplot(midwest, aes(x=area, y=poptotal)) + 
  geom_point(aes(col=state, size=popdensity)) + 
  geom_smooth(method="loess", se=F) + 
  xlim(c(0, 0.1)) + 
  ylim(c(0, 500000)) + 
  labs(subtitle="Area Vs Population", 
       y="Population", 
       x="Area", 
       title="Scatterplot", 
       caption = "Source: midwest")

plot(gg)

Esse código gera o seguinte gráfico:

O que chama atenção aqui é a construção do gráfico, em várias etapas, através da combinação da resultante de diversas funções através de uma sintaxe elegante envolvendo soma. Lindo, não acha?

O produto

Podemos implementar essa ideia elegante facilmente em C#. Vejamos:

public class Plot
{
    // ..
    public static Plot operator +(Plot plot, Transform t) =>
        t.ApplyOn(plot);
}

public abstract class Transform
{
    public abstract Plot ApplyOn(Plot input);
        
    public static Transform operator +(Transform left, Transform right)
        => new MultiTransform(left, right);
}

public class MultiTransform : Transform
{
    private readonly Transform _left;
    private readonly Transform _right;

    public MultiTransform(Transform left, Transform right)
    {
        _left = left;
        _right = right;
    }
    public override Plot ApplyOn(Plot input) => 
        _right.ApplyOn(_left.ApplyOn(input));
}

O que temos aqui é simplesmente uma representação dos dois tipos de elementos que estamos combinando: 1) plotagem e 2) transformação.

Vamos avançar definindo uma transformação nula.

public class NullTransform : Transform
{
    public override Plot ApplyOn(Plot input) =>
        input;
}

Pronto! Estamos prontos para começar a definir nossa pequena biblioteca:

public static class MyGgPlot2
{
    public static Plot ggplot(object data) =>
        new Plot();

    public static Transform geom_point()
        => new NullTransform();

    public static Transform geom_smooth() 
        => new NullTransform();
}
[/csharp]

Com o tipo certo de recurso sintático nos autoriza a algo bem bacana.

[csharp][/csharp]
using static MyGgPlot2;
public class Program
{
    public static void Main()
    {
        var gg = ggplot(null)
                    + geom_point()
                    + geom_smooth();
    }
}

E por aí vai ...

O que acha?

Compartilhe este insight:

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Mais insights para o seu negócio

Veja mais alguns estudos e reflexões que podem gerar alguns insights para o seu negócio:

Some days ago, I heard a fantastic interview with Phil Haack on the IT Career Energizer Podcast. Here is the...
O que mais me agrada no C4 Model é a forma como detalhes vão sendo explicitados na medida em que...
In this post, I will show how to do your first steps with OpenCV quickly using Visual Studio 2017 and...
Tive o prazer de trocar ideias com o pessoal do #CanalDotNET sobre NoSQL, sobretudo RavenDB. Aqui, compartilho o registro em...
Tentando ser “Júnior” Minha carreira como amador remunerado em programação começou em 1992. Eu tinha quase 13 anos e era...
Neste post, compartilho mais algumas ideias que tenho adotado, com êxito, em meus projetos envolvendo Microsserviços e que podem ajudar...
Masterclass

O Poder do Metamodelo para Profissionais Técnicos Avançarem

Nesta masterclass aberta ao público, vamos explorar como o Metamodelo para a Criação, desenvolvido por Elemar Júnior, pode ser uma ferramenta poderosa para alavancar sua carreira técnica em TI.

Crie sua conta

Preencha os dados para iniciar o seu cadastro no plano anual do Clube de Estudos:

Crie sua conta

Preencha os dados para iniciar o seu cadastro no plano mensal do Clube de Estudos:

× Precisa de ajuda?