Sobre I na interface, achei uma ótima ideia por questões que voce sabe quando será uma Interface por causa da visibilidade, ao contrario do Java que voce precisa abrir a documentação do método/atributo e verificar se é uma interface, etc.

Não faz muito sentido né? Se você vai usar uma classe ou interface o mínimo que você precisa saber é o que ela oferece, normalmente lendo a documentação. Começar com I ou não, nesse caso não ajuda em nada.

Por exemplo, o que mudaria para você saber que IDbConnectioné uma interface? Se você não conhece-la, não ajudar muito de qualquer forma.

Agora imagina uma classe chamada DbConnection, não existem variações no seu sistema então DbConnection é a única classe que implementa o que você precisa. Se por ventura você precisar de variações, você pode converter a classe para uma interface sem mudar seu nome, e gerar classes derivadas como MySQLDbConnection e PostgreSQLDbConnection que implementem a interface DbConnection e tudo continuará funcionando.

Usar o I para interface me lembra a notação húngara que era usada muitos anos atrás, onde variáveis de texto começam como str, txt ou s, por exemplo:

  • strNomeCliente
  • txtEndereco
  • sEmail
  • intIdade
  • iDia
  • dtNascimento
  • ... e por aí vai

Se você precisa do I para diferenciar uma interface, então precisaria do A para uma classe abstrata (ADbConnection) certo? E do S para uma struct (SPessoa) não é?

Percebe que o I é só um ruído de um passado onde as IDEs não ofereciam tantas informações e a documentação não era tão acessível?