Tag Archives: Software Development

The Ifless Principle: Designing APIs Without Hidden Decisions

Introduction

One of the most dangerous lines of code isn’t the one that throws an exception — it’s the one that hides a decision.

As engineers, we often celebrate flexible methods: a single save() that “magically” knows when to insert or update, a send() that picks the right channel, or an approveOrReject() that decides the outcome. At first, it feels convenient. But hidden behind that convenience lives complexity, ambiguity, and a growing army of if-statements.

The problem with too many ifs is not only code readability. It’s that each of the multiple scenarios your team must design, test, and maintain. What looks like “just one more condition” can easily become exponential in cost.

Over time, I’ve adopted a design approach I call the ifless principle: instead of burying decisions in code, we make them explicit in the design of the API and in the domain itself.


The Ifless Principle

The idea is simple:

  • Don’t let your service decide what the user already knows.
  • Express different operations as different methods, commands, or entities, even if they initially share behavior.
  • Move intelligence into rich domain entities (following Domain-Driven Design), so that rules live where they belong.

In short: ifless is not about eliminating ifs, but about putting decisions in the right place.

Example 1: Save vs Insert/Update

❌ If-full version:

public void save(Order order) {
    if (order.getId() == null) {
        insert(order);
    } else {
        update(order);
    }
}

✅ Ifless version:

public void insert(Order order) { ... }
public void update(Order order) { ... }

Even if both methods are identical today, the design already anticipates that inserts and updates will evolve differently. More importantly, the caller knows the intent, so the service doesn’t have to guess.

Example 2: Approvals

If hidden in the service:

public void approveOrReject(Transaction tx, boolean approve) {
    if (approve) { ... } else { ... }
}

✅ Ifless API:

public void approve(Transaction tx) { ... }
public void reject(Transaction tx) { ... }

Each operation has its own lifecycle, rules, and evolution. Tests become more focused, and the API expresses intention clearly.

Example 3: Notifications

❌ Conditional channel selection:

notificationService.send(user, message, channel);

✅ Ifless separation:

emailNotification.send(user, message);
smsNotification.send(user, message);
pushNotification.send(user, message);

Instead of one method with multiple branching conditions, each channel implements its own rules. Adding a new channel doesn’t mean touching a giant switch-case.

Connection with Domain-Driven Design

In Domain-Driven Design (DDD), the domain model encapsulates the core logic. That means invariants (like “an order can only ship if it is paid”) should live inside the entity itself:

public class Order {
    public void ship() {
        if (!this.isPaid()) {
            throw new BusinessException("Order must be paid before shipping");
        }
        // proceed with shipping...
    }
}

Notice: there’s still an if — but it’s not scattered across services. It’s encapsulated in the place where the rule truly belongs: the Order entity.

This is ifless in spirit: decisions are modeled explicitly in the domain, not left to a god-service to decide.

Benefits of the Ifless Principle

    1. Clarity of API

    The method name tells you exactly what it does. No hidden branching.

    2. Reduced Test Explosion

    Each if doubles the number of possible execution paths. Removing ifs from services simplifies test design.

    Example: save() with insert/update needs at least 2 test suites; insert and update each need only 1.

    3. Evolution without Risk

    As requirements diverge, methods evolve independently. You don’t risk breaking insert logic while changing update.

    4. Alignment with SRP (Single Responsibility Principle)

    One method = one reason to change.

    5. Cleaner Architecture

    Services stay thin. Entities stay rich. Decisions are explicit.

    Trade-offs and Counterpoints

    No principle is universal. Ifless comes with its own costs:

    • Verbosity: You might end up with more methods or services, even when differences are minimal.
    • Client Burden: Sometimes, callers just want a convenient save(). Exposing too much detail can reduce ergonomics.
    • Breaking conventions: Frameworks like Hibernate and Spring Data already assume methods like save() or merge(). Going against the grain might surprise new developers.

    That’s why I see ifless not as a dogma, but as a compass. Use it when clarity, testability, and explicit design outweigh the convenience of a single method.

    Related Ideas and References


    Conclusion

    Every if has a cost. Not just in code complexity, but in testing, maintenance, and evolution.

    The ifless principle is about making decisions explicit in the design of your API and your domain. It’s about contracts that express intent without ambiguity.

    It doesn’t mean you’ll never write an if. It means your architecture won’t hide them in the wrong places.

    In the age of scaling startups with fewer resources, clarity in design is not a luxury — it’s survival.

    Adobe Flex, Padronizando seu código

    Olá Pessoal,

    Todo programador sabe o quão essencial é padronizar seus códigos, seja para um desenvolvimento em grupo, ou independente.

    Ao padronizar, você dá ao seu código algumas características que trazem benefícios futuros, ou presentes, como por exemplo:

    • Legibilidade no código;
    • Facilidade de distribuir os códigos;
    • Ajuda na manutenção do código;
    • Evitar que estagiários possam fazer códigos selvagens! =x

    Para quem ainda não viu,o Fábio Terracini da lista FlexDev fez há um tempo atráz, um Coding GuideLines para a DClick que visa padronizar os códigos MXML e ActionScript. O doc é muito bom, tanto que certas pessoas estão comentando até na lista FlexCoders.

    Link’s:

    Adobe Flex Coding Guidelines v1.2 (English).pdf

    Adobe Flex Coding Guidelines v1.2 (Portugues).pdf

    Adobe Flex Coding Guidelines (English version) *
    *Não deixe de olhar também os comentários do post, há algumas críticas, mas sabe como os Norte Americano são né….

    Bom, a dica está dada, agora… Produzir!

    =)

    Abraços!

    o/

    Convença sua Equipe: Para Desenvolvimento Web, é com Adobe® Flex™

    Há alguns dias, elaborei uma solução usando Flex aqui na empresa, e me pediram para argumentar
    o porque de usar o Flex, não medi esforços e logo fiz um .doc, Segue abaixo:

    Adobe Flex

    Características do Adobe® Flex™ 2:

    O Adobe® Flex™ 2, é um produto desenvolvido a princípio pela Macromedia, hoje fundida com a Adobe, empresa muito famosa por seus reconhecidos programas para WEB, como Adobe Photoshop, Adobe Dreamweaver, Adobe Acrobat Reader. O Adobe® Flex™ 2 é a solução de desenvolvimento de aplicativos mais completa e potente para se criar e fornecer aplicativos avançados de Internet (RIAs) no ambiente empresarial e na Web. Ele permite que as empresas criem aplicativos multimídia personalizados que melhorem significativamente a experiência do usuário, revolucionando o modo como as pessoas interagem com a Web.

    Ex: Flex Store, Gráficos, Style Explorer.


    O SDK (Software Development Kit) do Flex, a partir da versão 2.0, foi dado como free a comunidade, logo qualquer um podia baixar seu SDK, e programar e compilar de graça. Mais tarde em Abril de 2007, a Adobe decide tornar todo o Flex OpenSource, até mesmo o seu compilador (mxmlc.exe) sobre a licença (MPL) Mozilla Public License .
    O Flex conta com uma poderosa ferramenta para desenvolvimento, O Adobe Flex Builder™, uma IDE baseada no Eclipse™ o que agiliza muito o desenvolvimento de interfaces. Esta é uma ferramenta é cobrada pela Adobe®.

    A Licença do Adobe® Flex™ 2 e o que é Cobrado:

    O Flex, está sob a licença MPL, basicamente um código sob a licença MPL quando o fonte copiado ou alterado sob a licença Mozilla deve continuar sob esta licença. Porém, este código pode ser combinado em um programa com arquivos proprietários como por exemplo um servidor de aplicação como da BEA. Além disso, é possível criar uma versão proprietária de um código sob a licença Mozilla. Por exemplo, o navegador Netscape 6 e 7 são versões proprietárias das versões correspondentes da suíte Mozilla.
    Em todo o ambiente Flex, apenas o Flex Builder (IDE de desenvolvimento) e o Flex Charts (API para desenvolvimento de Gráficos), isto é, a princípio para se desenvolver com Flex não necessita ter gastos, lembrando que todo o SDK do Flex é OpenSource. O Flex Builder já com a API de Gráficos, fica em torno de U$500,00 a U$600,00.

    O Lado “Servidor “ do Flex…

    A princípio, o Adobe® Flex™ 2 não necessita de um servidor de aplicação, uma vez que o Flex é apenas umas solução para a camada de aprensentação, porém o Flex pode rodar com liguagens como Java, PHP, ASP, C#, ColdFusion, e estes necessitam de um servidor de aplicação, para isto existe Frameworks OpenSource que estão do lado do servidor, que fazem a comunicação entre o Flex, e alguma linguagem.
    Como por exemplo, para integração do Flex com Java usando o servidor da BEA Workshop, existe o GraniteDataServices ou OpenAMF.

    Vantagens de se utilizar o AdobeFlex:

    Em comparativo com Telas em Html (JSP):

    • Não há necessidade de programar compatibilidade entre browsers, como o Firefox ou Internet Explorer, pois a aplicação Flex roda sobre uma Máquina virtual, nada mais nada menos que o plugin Flash, este encontrado em 98% dos computadores na WEB.
    • Com a ajuda do Flex Builder, o desenvolvimento fica muito ágil, uma vez que o Flex B uilder tende a ser uma ferramenta RAD(Rapid Application Development, como Delphi) o que resumidamente é clicar e arrastar para desenhar telas.
    • A interface final, sempre fica dinâmica e mais interativa.

    Em comparativo com o OpenLaszlo:

    • O OpenLaszlo não contém uma IDE, o que retarda o processo de desenvolvimento.
    • O OpenLaszlo só se comunica através de XML, já o AdobeFlex, se comunica via WebServices, XML, RPC, AMF dentre outros. Lembrando que o protocolo desenvolvido pela Adobe, o AMF, é o mais rápido para troca de dados na WEB.Ver comparativo:

    http://www.jamesward.org/census/

  1. O OpenLaszlo conta um compilador, que compila quando uma requisição via browser é feita, logo quando se trata de uma aplicação muito grande, seu tempo de compilação é muito grande. Já o Flex pode ser compilado e depois ser colocado em produção, ou também ser compilado quando for requisitado pelo browser.
  2. O OpenLaszlo não tem uma empresa administradora de reconhecimento no mercado, o que torna difícil ter uma possível consultoria.
  3. A sintaxe da linguagem do OpenLaszlo a primeira vista é complicada, o que torna o tempo de aprendizado mais longo. Já com o Flex a sintaxe é muito similar com HTML.
  4. Gerais..:

    • O Flex é a complementação da WEB 2.0, conceito que resumidamente deixa equivalente a visualização de um sistema Desktop e um sistema WEB. Só que de maneira mais dinâmica onde o clicar e carregar uma nova página desaparece!
    • Fácil Integração com Servidores J2EE, como por exemplo o Servidor de Aplicação da BEA WebLogic. Também vale lembrar que a BEA em suas versões mais novas, já integrou o Adobe Flex. Ver:

    BEA Flex

  5. Documentação bem elaborada.
  6. Suporta Clusterização.
  7. Seu SDK

    todo OpenSource Licenciado sob a licença da MPL.
    A Comunidade Flex está cada dia maior, logo fica fácil a troca de opiniões e dúvidas.
    Se necessário suporte da Adobe.