El código abierto no es un concepto nuevo y puede encontrar proyectos de código abierto para casi todos los marcos de uso común. En 2010, UCI publicó su corpus de proyectos que contiene alrededor de 18.000 proyectos de código abierto de Java. Podemos buscar y encontrar fácilmente proyectos que utilizan frameworks populares como Eclipse RCP, Struts 2, Spring, Android, etc.
Es de sentido común que el marco es difícil de aprender, especialmente aquellos marcos grandes que tienen miles de clases / interfaces. La investigación ha demostrado que una barrera es la falta de ejemplos. Con esos proyectos de código abierto, no creo que la falta de ejemplos sea tan crítica como lo era antes, porque no es difícil encontrar ejemplos. A continuación, mostraré cómo usar proyectos de código abierto para aprender el marco Eclipse RCP.
Los desarrolladores que utilizan Eclipse RCP pueden seguir la regla «El mono ve, el mono hace». Es decir, busque un proyecto existente que use Eclipse RCP y haga algo similar. Este enfoque es muy eficaz. Básicamente, necesitamos dos cosas: un proyecto Eclipse RCP decente y Eclipse Java API Doc. Comenzamos leyendo el código y revisamos el Doc cada vez que vemos alguna clase / interfaz / método que no es obvio de entender.
Aquí hay una lista de proyectos que utilizan el marco Eclipse RCP. Esas se pueden llamar aplicaciones cliente Eclipse RCP y todas son del código de Google. Podemos examinar el diseño de archivos de esos proyectos RCP y el código fuente de cada clase. He verificado su accesibilidad y aquí están los enlaces:
Proyectos de código abierto de Eclipse RCP:
- http://code.google.com/p/localizedproperties/
- http://code.google.com/p/audiotageditor/
- http://code.google.com/p/pluralism/
- http://code.google.com/p/eclipse-plugin-ftp-server/
- http://code.google.com/p/change-impact-analysis/
- http://code.google.com/p/eclipsender/
- http://code.google.com/p/humiee/
- http://code.google.com/p/zeusatlas/
- http://code.google.com/p/i18n-mead-properties-plugin/
- http://code.google.com/p/overtureeditor/
También puede explorar clases o interfaces de uso común y leer directamente su código mediante ejemplos de API.
Lo primero que aprendemos es el diseño de un proyecto típico, es decir, una perspectiva, una vista, etc.
Excepto el código específico del dominio, también podemos encontrar el uso de la API de marco.
Por ejemplo, desde esta clase de vista: http://code.google.com/p/eclipse-plugin-ftp-server/source/browse/trunk/plugin/src/com/holmconsulting/ftp/server/plugin/views/ FTPServerView.java, tiene el siguiente método createPartControl.
public void createPartControl(Composite parent) { viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); createColumns(viewer, parent); File rootDir = Activator.getDefault().getStateLocation().toFile(); List<File> files = new ArrayList<File>(); FileUtils.getInstance().loadFiles(rootDir, files); viewer.setContentProvider(new ViewContentProvider(files)); viewer.setLabelProvider(new ViewLabelProvider()); viewer.setInput(getViewSite()); getSite().setSelectionProvider(viewer); FileWrapperSorter sorter = new FileWrapperSorter(); viewer.setSorter(sorter); // Initial sort sorter.setColumnName(COL_RECEIVED); viewer.getTable().setSortDirection(SWT.UP); viewer.getTable().setSortColumn( viewer.getTable().getColumn( viewer.getTable().getColumnCount() - 1)); viewer.refresh(); // Create the help context id for the viewer's control PlatformUI.getWorkbench().getHelpSystem() .setHelp(viewer.getControl(), "viewer.context.help"); makeActions(); hookContextMenu(); hookDoubleClickAction(); contributeToActionBars(); //IContextService contextService = (IContextService) getSite() // .getService(IContextService.class); //contextService.activateContext("viewer.context.help"); PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "com.holmconsulting.ftp.server.plugin.viewer"); } |
Podemos captar fácilmente cómo usar un TableViewer, desde el fragmento de código:
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); viewer.setContentProvider(new ViewContentProvider(files)); viewer.setLabelProvider(new ViewLabelProvider()); viewer.setInput(getViewSite()); |
A diferencia de Eclipse RCP, es posible que otros marcos no tengan un diseño y una jerarquía de clases tan obvios; exploraré cómo usar proyectos de código abierto para aprender otros marcos más adelante.