Sample

Schnappinger/argoUML/org.argouml.core.propertypanels.ui.UMLOFSStateListModel

Human rating uses the original dataset scale.

Human3.02
Lines239

Scores

MethodScoreScaleDataset rank
(0–100)
Posnett00–1; higher is more readable
29.4Δ 0.9
Scalabrino0.7490–1; higher is more readable
47.9Δ 17.6
Dorn0.1290–1; higher is more readable
35.6Δ 5.3
Mi0.5220–1; higher is more readable
37.3Δ 6.9
LLOC72Logical lines; fewer is more readable
28.5Δ 1.8
DeepSeek V4 Pro14.330–20; mean of three runs
32.3Δ 2.0
GPT-6.1 Sol150–20; mean of three runs
25.7Δ 4.6
BTTF0.3760–1; higher is more readable
31.7Δ 1.3
Human3.021–4; original rating
30.4

Views

Source code

/* $Id: UMLOFSStateListModel.java 17896 2010-01-12 21:36:11Z linus $ ***************************************************************************** * Copyright (c) 2009 Contributors - see below * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * bobtarling ***************************************************************************** * * Some portions of this file was previously release using the BSD License: */ // Copyright (c) 2008 The Regents of the University of California. All // Rights Reserved. Permission to use, copy, modify, and distribute this // software and its documentation without fee, and without a written // agreement is hereby granted, provided that the above copyright notice // and this paragraph appear in all copies. This software program and // documentation are copyrighted by The Regents of the University of // California. The software program and documentation are supplied "AS // IS", without any accompanying services from The Regents. The Regents // does not warrant that the operation of the program will be // uninterrupted or error-free. The end-user understands that the program // was developed for research purposes and is advised not to rely // exclusively on the program for any reason. IN NO EVENT SHALL THE // UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, // SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, // ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF // THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF // SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE // PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF // CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, // UPDATES, ENHANCEMENTS, OR MODIFICATIONS. package org.argouml.core.propertypanels.ui; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.argouml.i18n.Translator; import org.argouml.model.Model; import org.argouml.uml.ui.AbstractActionAddModelElement2; import org.argouml.uml.ui.AbstractActionRemoveElement; /** * @author mkl */ class UMLOFSStateListModel extends UMLModelElementListModel { /** * The class uid */ private static final long serialVersionUID = -9214579555300746872L; /** * Constructor for UMLOFSStateListModel. */ public UMLOFSStateListModel(Object modelElement) { /* TODO: This needs work... * We also need to listen to addition/removal * of states to/from a ClassifierInState. */ super("type", modelElement.getClass(), new ActionAddOFSState(), new ActionRemoveOFSState()); setTarget(modelElement); } /* * @see org.argouml.uml.ui.UMLModelElementListModel2#buildModelList() */ protected void buildModelList() { if (getTarget() != null) { Object classifier = Model.getFacade().getType(getTarget()); if (Model.getFacade().isAClassifierInState(classifier)) { Collection c = Model.getFacade().getInStates(classifier); setAllElements(c); } } } /* * @see org.argouml.uml.ui.UMLModelElementListModel2#isValidElement(java.lang.Object) */ protected boolean isValidElement(Object elem) { Object t = getTarget(); if (Model.getFacade().isAState(elem) && Model.getFacade().isAObjectFlowState(t)) { Object type = Model.getFacade().getType(t); if (Model.getFacade().isAClassifierInState(type)) { Collection c = Model.getFacade().getInStates(type); if (c.contains(elem)) { return true; } } } return false; } /** * @author mkl */ private static class ActionAddOFSState extends AbstractActionAddModelElement2 { private Object choiceClass = Model.getMetaTypes().getState(); /** * The constructor. */ public ActionAddOFSState() { super(); setMultiSelect(true); } protected void doIt(Collection selected) { Object t = getTarget(); if (Model.getFacade().isAObjectFlowState(t)) { Object type = Model.getFacade().getType(t); if (Model.getFacade().isAClassifierInState(type)) { Model.getActivityGraphsHelper().setInStates(type, selected); } else if (Model.getFacade().isAClassifier(type) && (selected != null) && (selected.size() > 0)) { /* So, we found a Classifier * that is not a ClassifierInState. * And at least one state has been selected. * Well, let's correct that: */ Object cis = Model.getActivityGraphsFactory() .buildClassifierInState(type, selected); Model.getCoreHelper().setType(t, cis); } } } protected List getChoices() { List ret = new ArrayList(); Object t = getTarget(); if (Model.getFacade().isAObjectFlowState(t)) { Object classifier = getType(t); if (Model.getFacade().isAClassifier(classifier)) { ret.addAll(Model.getModelManagementHelper() .getAllModelElementsOfKindWithModel(classifier, choiceClass)); } removeTopStateFrom(ret); } return ret; } protected String getDialogTitle() { return Translator.localize("dialog.title.add-state"); } protected List getSelected() { Object t = getTarget(); if (Model.getFacade().isAObjectFlowState(t)) { Object type = Model.getFacade().getType(t); if (Model.getFacade().isAClassifierInState(type)) { return new ArrayList(Model.getFacade().getInStates(type)); } } return new ArrayList(); } private static Object getType(Object target) { Object type = Model.getFacade().getType(target); if (Model.getFacade().isAClassifierInState(type)) { type = Model.getFacade().getType(type); } return type; } /** * Utility function to remove the top states * from a given collection of states. * * @param ret a collection of states */ static void removeTopStateFrom(Collection ret) { Collection tops = new ArrayList(); for (Object state : ret) { if (Model.getFacade().isACompositeState(state) && Model.getFacade().isTop(state)) { tops.add(state); } } ret.removeAll(tops); } } /** * @author mkl */ private static class ActionRemoveOFSState extends AbstractActionRemoveElement { /** * The class uid */ private static final long serialVersionUID = 4745674604611374936L; /** * Constructor. */ public ActionRemoveOFSState() { super(Translator.localize("menu.popup.remove")); } @Override public void actionPerformed(ActionEvent e) { super.actionPerformed(e); Object state = getObjectToRemove(); if (state != null) { Object t = getTarget(); if (Model.getFacade().isAObjectFlowState(t)) { Object type = Model.getFacade().getType(t); if (Model.getFacade().isAClassifierInState(type)) { Collection states = new ArrayList( Model.getFacade().getInStates(type)); states.remove(state); Model.getActivityGraphsHelper() .setInStates(type, states); } } } } } }

Loading feature diagnosis…

Source regions

Feature contributions

Feature contributions

FeatureValueContribution
(log-odds)
Halstead volumeHow much symbolic information the code contains. It combines the total number of operators and values with the number of distinct ones.6421.826−211.92
Source linesThe number of non-empty source lines.239+95.6
Byte entropyHow varied the bytes in the source text are. Repeated bytes give a lower value; a more even mixture gives a higher value.4.605−6.907

Intercept 8.87 + feature contributions = -114.358 (log-odds).
Score = sigmoid(-114.358) = 0.

Score0.749

Feature contributions

FeatureValueContribution
(log-odds)
Comment layout frequencyHow frequently the layout switches between lines containing only comments or whitespace and lines containing code.240−7.461
Indentation frequencyHow rapidly indentation changes from line to line.172+5.212
Number layout frequencyHow rapidly the number of numeric values per line changes through the code.172−3.526
Identifier layout (vertical)How rapidly the visual pattern of identifier characters changes from top to bottom.238.833+2.929
Comment layout (horizontal)How rapidly the visual pattern of comment characters changes from left to right.88.892+0.63
Operator visual areaThe share of the code’s visual area occupied by operators such as +, =, and *.0.062+0.339
Identifier layout (horizontal)How rapidly the visual pattern of identifier characters changes from left to right. It measures spatial frequency, not the meaning of the names.88.971−0.103

Intercept 0.07 + feature contributions = -1.911 (log-odds).
Score = sigmoid(-1.911) = 0.129.

Score0.522
Score72
Run 1

The code demonstrates generally clear structure with logical class organization and proper method separation. Class and method purposes are evident from names. However, readability is hampered by several factors: excessive boilerplate license headers (not code logic but distracting), deep nesting in methods like ActionAddOFSState.doIt and getChoices reaching 3-4 levels, and some methods combining multiple actions per line (e.g., chained Model.getFacade() calls). Variable names like 't', 'c', 'cis' are cryptic. Many null/type checks create repetitive conditional blocks. The actionPerformed method shows reasonable flow but could be flattened. Comments are sparse in complex logic areas. Overall, competent but not exemplary readability.

Run 2

The code is generally well-structured with clear class and method separation. It uses consistent formatting, meaningful method names, and logical grouping of related operations. Nesting is moderate and justified in validation logic. Some duplication exists between methods checking ObjectFlowState/ClassifierInState chains (e.g., in buildModelList, isValidElement, and action classes), which slightly reduces clarity. The removeTopStateFrom loop could be simpler, and the empty collection check in ActionAddOFSState could use isEmpty(). Javadoc comments are helpful but occasionally verbose. Overall, the code is readable but would benefit from extracting the repeated type-checking pattern into a helper method.

Run 3

The code shows moderate readability with clear organization through logical class structure and method segmentation. However, it suffers from inconsistent indentation and excessive empty lines between methods, disrupting reading flow. Nesting is reasonably flat (2-3 levels), though some methods like getChoices() and actionPerformed() contain multiple conditional branches that could be simplified. Intent is generally clear through descriptive method names, but some operations like 'removeTopStateFrom' violate single responsibility by mixing filtering logic with collection manipulation. Action granularity is acceptable but several lines combine multiple operations. The code length is inflated by verbose comments and duplicated model facade checks. Overall structure is logical but readability is hampered by inconsistent formatting and some overly complex conditionals.

Run 1

1. Code Structure: Well organized into a list model and separate nested add/remove action classes, with focused helper methods. 2. Nesting: Several methods contain two or three nested conditionals; guard clauses would make validation and removal easier to follow. 3. Clarity of intent: Method names and domain-specific API calls convey purpose, but abbreviations such as t, c, cis, and ret, along with raw collections and Object types, obscure meaning. 4. Code length: Methods are reasonably short, although repeated facade calls, boilerplate comments, and excess blank lines add verbosity. 5. Action granularity: Statements generally perform one action per line; wrapped method chains remain understandable. 6. Reading flow: The progression from construction and validation to addition and removal is natural, but repeated type checks, lengthy call chains, and inconsistent spacing interrupt scanning.

Run 2

Code Structure: The list model and separate add/remove action classes provide logical organization, with small methods and focused helpers. Nesting: Several methods contain two or three nested conditionals; guard clauses could simplify validation and removal paths. Clarity of intent: Method names and model API calls generally communicate purpose, but abbreviations such as t, c, ret, and cis, raw collections, and pervasive Object types obscure meaning. Code length: Implementation methods are reasonably concise, though repeated target/type checks, boilerplate comments, and the lengthy license header increase reading overhead. Action granularity: Statements generally perform one action per line, and intermediate variables help separate operations. Reading flow: Consistent formatting and related method grouping support navigation, but repeated facade chains, uneven blank-line spacing, and wrapped expressions occasionally interrupt the flow.

Run 3

Code Structure: Logically organized into a list model and separate nested add/remove action classes, with focused methods. Nesting: Several methods contain two to three nested conditionals, making validation and removal harder to scan; guard clauses would simplify them. Clarity of intent: Descriptive method names and model API calls communicate the purpose, but abbreviated variables such as t, c, ret, and cis, raw collections, and pervasive Object types reduce clarity. Code length: Implementation is reasonably concise, though repeated facade checks, boilerplate comments, and the lengthy license header add reading overhead. Action granularity: Statements generally perform one action per line, with clear separation of retrieval, checks, and updates. Reading flow: Methods follow a natural check-fetch-update sequence, but repeated chained API calls, uneven spacing, and wrapped expressions occasionally interrupt the flow.