http://netponto.org15ª Reunião Presencial - 23/10/2010Práticas de programação em .NETRicardo Alves
Ricardo AlvesLicenciado do Instituto Superior de Engenharia de Lisboa (ISEL)4 anos de experiência profissionalC#, WCF, ASP.NET, SQL, VS LightSwitch, Agilemethodologies
AgendaNamingConventionsCodingPracticesUnitTestsPractices
Também disponível em vídeo...Assista!http://www.vimeo.com/16498136
NamingConventionsCódigo tem de reflectir a sua intençãoCódigo claro e objectivoMeio caminho andado para documentação 
Naming ConventionsNamingConventions da .Net Frameworkhttp://msdn.microsoft.com/en-us/library/ms229045.aspxEscolher nomes facilmente legíveis e clarosDar preferência a legibilidade sobre brevidadeNão usar underscore, hífenes, ou qualquer caracter não alfanuméricoNão usar abreviações como identificadores
Naming ConventionsNamingConventions da .Net Frameworkhttp://msdn.microsoft.com/en-us/library/ms229045.aspxSó usar acrónimos que sejam bem conhecidosRegra do BingFazer uma pesquisa no Bing pelo acrónimo, se o acrónimo aparecer nos primeiros resultados então podemos usarRegra não se aplica a acrónimos do negócioUsar nomes comuns, como value ou item, em casos onde o identificador e o seu tipo não têm qualquer valor semânticoUsado em parâmetros ou variáveis de iteraçãoNão usar “Hungariannotation”
Naming ConventionsNamingConventions da .Net Frameworkhttp://msdn.microsoft.com/en-us/library/ms229045.aspxPascal CaseA primeira letra é maiúscula e as restantes primeiras letras de cada palavra são maiúsculasObjectContext, BackColorCamel CaseA primeira letra é minúscula e as restantes primeiras letras de cada palavra são maiúsculasnumberOfDays, isValidUppercaseTodas as letras são maiúsculasPI, ID
Naming ConventionsNamespacesPascal Case, não usar underscoresAcrónimos de 3 ou mais letras devem usar Pascal CaseSeguir padrão:<Nome da Empresa/Developer>.<Tecnologia>AppliedIS.TimeCard.BusinessRulesIrritatedVowel.ControllersPeteBrown.DotNetTraining.InheritanceDemoPeteBrown.DotNetTraining.Xml
Naming ConventionsClasses e estruturasPascal Case, não usar underscoresNão usar nomes começados por “I” a não ser que a próxima letra seja minúscula, para não confundir com interfacesAcrónimos de 3 ou mais letras devem usar Pascal CaseNão devem usar o mesmo nome que o Namespace a que pertencemWidgetInstanceManagerXmlDocumentMainFormDocumentFormHeaderControl
Naming ConventionsInterfacesUsar as mesmas convenções que para as classes, mas o nome deve começar com um “I” e a próxima letra deve ser maiúsculaIWidgetIComponent
Demo #1: Validar NamingConventions através do FxCopdemonstração
CodingPracticesPrincípios S.O.L.I.D.
CodingPracticesSOLIDSingle ResponsibilityPrincipleOpen/ClosedPrincipleLiskovSubstitutionPrincipleInterface SegregationPrincipleDependencyInversionPrinciple
CodingPracticesSingle ResponsibilityPrinciple
CodingPracticesSingle ResponsibilityPrincipleUma classe não deve ter mais que uma razão para ser alterada
Demo #2: Single ResponsabilityPrincipledemonstração
CodingPracticesOpen/ClosedPrinciple
CodingPracticesOpen/ClosedPrincipleDeve ser possível alterar o comportamento duma classe sem a modificar
Demo #3: Open/ClosedPrincipledemonstração
CodingPracticesLiskovSubstitutionPrinciple
CodingPracticesLiskovSubstitutionPrincipleClasses derivadas devem ser substituíveis pelas suas classes base
Demo #4: LiskovSubstitutionPrincipledemonstração
CodingPracticesInterface SegregationPrinciple
CodingPracticesInterface SegregationPrincipleClasses não devem ser forçadas a implementar interfaces que não usam
Demo #5: Interface SegregationPrincipledemonstração
CodingPracticesDependencyInversionPrinciple
CodingPracticesDependencyInversionPrincipleMódulos não devem depender de outros Módulos, devem depender de abstracçõesAbstracções não devem depender dos detalhes, os detalhes é que devem depender das abstracções
Demo #6: DependencyInversionPrincipledemonstração
CodingPracticesYAGNIYouain’tgonnaneeditDRYDon’trepeatyourselfKISSKeepitsimple, stupid!
Unit Tests PracticesSer o mais simples possívelSer independentes entre siDevem testar uma unidade de código de cada vezUsar Mocks para simular componentes externosNão testar configuraçõesNão devem fazer asserções desnecessárias
Unit Tests PracticesDevem ter nomes claros e concisosTestar comportamentos e não métodosTestar apenas classes e métodos com visibilidade publicaCriar testes para reproduzir bugs encontradosAssegurar que as excepções que são lançadas têm testes associados
Demo #6: UnitTestsPracticesdemonstração
Dúvidas?
ReferênciasThePrinciplesof OODhttp://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOodDesign Guidelines for Developing Class Librarieshttp://msdn.microsoft.com/en-us/library/ms229042.aspxFramework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries http://www.amazon.com/Framework-Design-Guidelines-Conventions-Libraries/dp/0321545613
Patrocinadores desta reunião
Obrigado!Ricardo Alvesricardoloboalves@gmail.comhttp://pt.linkedin.com/in/rmalves/http://twitter.com/rmalves

Práticas de Programação em .NET

Notas do Editor

  • #5 Namingconventions é um dos elementos mais importantes de previsibilidade e de descoberta em uma aplicaçãoO uso difundido e a compreensão destas convenções deve eliminar muitas das perguntas mais básicas e comuns dos utilizadores
  • #6 HorizontalAlignment tem umalegibilidade superior a AlignmentHorizontalCanScrollHorizontally é muitomaislegivel e claroqueScrollableX (referencia “obscura” aoeixo X)
  • #7 UsarOnButtonClick em vez de OnBtnClickGetLength é melhorqueGetInt
  • #8 Validar as convençõesusadasporomissão no stylecop, ver se nãobatem com os slidesanterioresVer se ainda se consegueconfigurar novas regras de validação no StyleCop
  • #13 Five valuation principles of object-oriented developmentManage dependencies between classes and reduce unnecessary complexityFacilitates testingPrinciples, not lawsRequire students
  • #16 Umaclassedevefazerapenasumacoisa, e deve faze-la bem
  • #17 É aplicavel a pacotes, assemblies, etcÉ a base paratodososoutrosprincipios
  • #19 Devemosusarpolimorfismo e herançaparapoder extender a classe e modificar o comportamentonaderivada, nuncaalterando o codigoda original
  • #20 O principio maisimportante de todosOs requisitosestãosempreemconstantemudança, masprecisamos de desenvolvercodigoestavel a mesmaCom OO,conseguimoscriarabstrações com desenhosolido, mascomportamentoflexivelA grandequestão e quandodevemosaplicareste principio
  • #22 Nãodevehaverpreocupação entre usar a classe base ou a derivada
  • #23 Violaçãodeste principio indicaquedevemosprecisar de fazeralgumrefactornanossahierarquia de classesIsto é um principio, nãouma lei
  • #25 Criar interfaces pequenas e consistentesSe temosumaclasseabstractaou interface,entãoosimplementadoresnãodevem ser forçados a implementarpartesquenãolhesinteressam
  • #28 Classes nãodevemdevpender de outras classes, elesdevemdepender de abstrações (interfaces)Prevent: Rigid (change affects too many parts of the system) Fragile (every change breaks something unexpected) Immobile (impossible to reuse)
  • #31 Validar as convençõesusadasporomissão no stylecop, ver se nãobatem com os slidesanterioresVer se ainda se consegueconfigurar novas regras de validação no StyleCop