# See the License for the specific language governing permissions and
# limitations under the License.
-# The mndel model helps to understand class hierarchies
+# The Mendel model helps to understand class hierarchies.
#
# It provides metrics to extract interesting classes:
#
# * replacers that have less redefinitions that call super than not calling it
#
# For more details see
-# Mendel: A Model, Metrics and Rules to Understan Class Hierarchies
-# S. Denier and Y. Gueheneuc
-# in Proceedings of the 16th IEEE International Conference on Program Comprehension (OCPC'08)
+# “Mendel: A Model, Metrics and Rules to Understand Class Hierarchies,”
+# by S. Denier and Y. Gueheneuc,
+# in *Proceedings of the 16th IEEE International Conference on Program Comprehension* (OCPC'08).
module mendel_metrics
import metrics_base
end
var cnblp = new CNBLP(mainmodule, model_view)
- var cnvi = new CNVI(mainmodule)
- var cnvs = new CNVS(mainmodule)
+ var cnvi = new CNVI(mainmodule, model_view)
+ var cnvs = new CNVS(mainmodule, model_view)
var metrics = new MetricSet
metrics.register(cnblp, cnvi, cnvs)
metrics.collect(mclasses)
- if csv then metrics.to_csv.save("{out}/mendel.csv")
+ if csv then metrics.to_csv.write_to_file("{out}/mendel.csv")
var threshold = cnblp.threshold
print toolcontext.format_h4("\tlarge mclasses (threshold: {threshold})")
if csv then
var csvh = new CsvDocument
- csvh.format = new CsvFormat('"', ';', "\n")
+ csvh.separator = ';'
csvh.header = ["povr", "ovr", "pext", "ext", "pspe", "spe", "prep", "rep", "eq"]
for mclass in mclasses do
var povr = mclass.is_pure_overrider(model_view).object_id
var eq = mclass.is_equal(model_view).object_id
csvh.add_record(povr, ovr, pext, ext, pspe, spe, prep, rep, eq)
end
- csvh.save("{out}/inheritance_behaviour.csv")
+ csvh.write_to_file("{out}/inheritance_behaviour.csv")
end
end
end
redef fun name do return "cbms"
redef fun desc do return "branch mean size, mean number of introduction available among ancestors"
- # Mainmodule used to compute class hierarchy.
- var mainmodule: MModule
- private var protected_view: ModelView = mainmodule.model.protected_view is lateinit
-
redef fun collect(mclasses) do
for mclass in mclasses do
- var totc = mclass.collect_accessible_mproperties(protected_view).length
+ var totc = mclass.collect_accessible_mproperties(model_view).length
var ditc = mclass.in_hierarchy(mainmodule).depth
values[mclass] = totc.to_f / (ditc + 1).to_f
end
redef fun collect(mmodules) do
for mmodule in mmodules do
- var totc = mmodule.collect_intro_mclassdefs(mmodule.protected_view).length
- totc += mmodule.collect_redef_mclassdefs(mmodule.protected_view).length
+ var totc = mmodule.collect_intro_mclassdefs(model_view).length
+ totc += mmodule.collect_redef_mclassdefs(model_view).length
var ditc = mmodule.in_importation.depth
values[mmodule] = totc.to_f / (ditc + 1).to_f
end
redef fun name do return "cnvi"
redef fun desc do return "class novelty index, contribution of the class to its branch in term of introductions"
- # Mainmodule used to compute class hierarchy.
- var mainmodule: MModule
- private var protected_view: ModelView = mainmodule.model.protected_view is lateinit
-
redef fun collect(mclasses) do
- var cbms = new CBMS(mainmodule)
+ var cbms = new CBMS(mainmodule, model_view)
for mclass in mclasses do
# compute branch mean size
var parents = mclass.in_hierarchy(mainmodule).direct_greaters
cbms.clear
cbms.collect(new HashSet[MClass].from(parents))
# compute class novelty index
- var locc = mclass.collect_accessible_mproperties(protected_view).length
+ var locc = mclass.collect_accessible_mproperties(model_view).length
values[mclass] = locc.to_f / cbms.avg
else
values[mclass] = 0.0
redef fun desc do return "module novelty index, contribution of the module to its branch in term of introductions"
redef fun collect(mmodules) do
- var mbms = new MBMS
+ var mbms = new MBMS(mainmodule, model_view)
for mmodule in mmodules do
# compute branch mean size
var parents = mmodule.in_importation.direct_greaters
mbms.clear
mbms.collect(new HashSet[MModule].from(parents))
# compute module novelty index
- var locc = mmodule.collect_intro_mclassdefs(mmodule.protected_view).length
- locc += mmodule.collect_redef_mclassdefs(mmodule.protected_view).length
+ var locc = mmodule.collect_intro_mclassdefs(model_view).length
+ locc += mmodule.collect_redef_mclassdefs(model_view).length
values[mmodule] = locc.to_f / mbms.avg
else
values[mmodule] = 0.0
redef fun name do return "cnvs"
redef fun desc do return "class novelty score, importance of the contribution of the class to its branch"
- # Mainmodule used to compute class hierarchy.
- var mainmodule: MModule
- private var protected_view: ModelView = mainmodule.model.protected_view is lateinit
-
redef fun collect(mclasses) do
- var cnvi = new CNVI(mainmodule)
+ var cnvi = new CNVI(mainmodule, model_view)
cnvi.collect(mclasses)
for mclass in mclasses do
- var locc = mclass.collect_local_mproperties(protected_view).length
+ var locc = mclass.collect_local_mproperties(model_view).length
values[mclass] = cnvi.values[mclass] * locc.to_f
end
end
redef fun desc do return "module novelty score, importance of the contribution of the module to its branch"
redef fun collect(mmodules) do
- var mnvi = new MNVI
+ var mnvi = new MNVI(mainmodule, model_view)
mnvi.collect(mmodules)
for mmodule in mmodules do
- var locc = mmodule.collect_intro_mclassdefs(mmodule.protected_view).length
- locc += mmodule.collect_redef_mclassdefs(mmodule.protected_view).length
+ var locc = mmodule.collect_intro_mclassdefs(model_view).length
+ locc += mmodule.collect_redef_mclassdefs(model_view).length
values[mmodule] = mnvi.values[mmodule] * locc.to_f
end
end